Skip to content

Instantly share code, notes, and snippets.

@Kakadu
Created October 6, 2021 18:38
Show Gist options
  • Save Kakadu/331354abae0269e6495bbb0af416853c to your computer and use it in GitHub Desktop.
Save Kakadu/331354abae0269e6495bbb0af416853c to your computer and use it in GitHub Desktop.
C# and new virtual methods. Many thanks to @kbatoev
public interface IInterface {
int F();
}
public class A {
public virtual int F() {
return 7;
}
}
var a = new A();
Console.WriteLine("######################################");
Console.WriteLine("((A) a).F() = {0}", ((A) a).F()); // 7
public class B : A, IInterface {
public override int F() {
return 8;
}
}
var b = new B();
Console.WriteLine("######################################");
Console.WriteLine("((A) b).F() = {0}", ((A) b).F()); // 8
Console.WriteLine("((IInterface) b).F() = {0}", ((IInterface) b).F()); // 8
public class C : B, IInterface {
public override int F() {
return 9;
}
int IInterface.F() {
return 100;
}
}
var c = new C();
Console.WriteLine("######################################");
Console.WriteLine("((A) c).F() = {0}", ((A) c).F()); // 9
Console.WriteLine("c.F() = {0}", ((IInterface) c).F()); // 100
public class D : C {
public new int F() {
return -10;
}
}
var d = new D();
Console.WriteLine("######################################");
Console.WriteLine("((A) d).F() = {0}", ((A) d).F()); // 9
Console.WriteLine("d.F() = {0}", d.F()); // -10
Console.WriteLine("((IInterface) d).F() = {0}", ((IInterface) d).F()); // 100
public class D1 : C, IInterface {
public new int F() {
return -11;
}
}
var d1 = new D1();
Console.WriteLine("######################################");
Console.WriteLine("((IInterface) d1).F() = {0}", ((IInterface) d1).F()); // -10
// compile error because of ``override'' -- needed virtual keyword in class D
// public class E : D {
// public override int F() {
// return -10;
// }
// }
public class E : C {
public new virtual int F() {
return 10;
}
}
var e = new E();
Console.WriteLine("######################################");
Console.WriteLine("((A) e).F() = {0}", ((A) e).F()); // 9
Console.WriteLine("e.F() = {0}", e.F()); // 10
Console.WriteLine("((IInterface) e).F() = {0}", ((IInterface) e).F()); // 100
Console.WriteLine("((IInterface) ((B) e)).F() = {0}", ((IInterface) ((B) e)).F()); // 100
public class G : E, IInterface {
public override int F() {
return 11;
}
}
var g = new G();
Console.WriteLine("######################################");
Console.WriteLine("((A) g).F() = {0}", ((A) g).F()); // 9
Console.WriteLine("((IInterface) g).F() = {0}", ((IInterface) g).F()); // 11
Console.WriteLine("((E) g).F() = {0}", ((E) g).F()); // 11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment