Java inheritance vs. C# inheritance
c#, hierarchy, inheritance, java
Solution
It's for the virtual function definition:
a virtual function or virtual method is a function or method whose behavior can be overridden within an inheriting class by a function with the same signature. This concept is a very important part of the polymorphism portion of object-oriented programming (OOP).
In C#,you should declare the method as virtual in order to be overriden, as shown in MSDN:
- C# Lang Spec. Virtual keyword
- C# Virtual
Since the `M` method is not virtual, it will execute `b.M()` even if `b` variable is actually a `D` instance.
In Java, every non-static method is virtual by default, so you when you override a method (even without the `@Override` annotation) the behavior of the `b.M()` will be the `d.M()` that inherits the `c.M()` method behavior.
How can I change Java code to print out B-C-C just like C# does? I mean, how can I teach java to invoke the method of the exact reference it uses?
You simply can't do this in Java. The `M` method in `C` class would override the `M` method in `B`. Adding the `final` modifier to `B#M` will just make that `C` or other `B` children can't override the `M()` method.
How can I change C# code to print out C-C-C? I mean, how can I teach C# to invoke the overriding method?
Change the `M` method in `B` class to `virtual` and override it in `C` class:
class B : A
{
public virtual void M()
{
Console.WriteLine("B");
}
}
class C : B
{
public override void M() // I need to use public new void M() to avoid the warning
{
Console.WriteLine("C");
}
}
Problem
Let's say Java has these hierarchical classes: ``` class A { } class B extends A { public void m() { System.out.println("B\n"); } } class C extends B { public void m() { System.out.println("C\n"); } } class D extends C { public static void main(String[] args) { A a = new D(); // a.m(); // doesn't work B b = new D(); b.m(); C c = new D(); c.m(); D d = new D(); d.m(); } } ``` This is the (blind) duplication of the same code in C#: ``` using System; class A { } class B : A { public void M() { Console.WriteLine("B"); } } class C : B { public void M() // I need to use public new void M() to avoid the warning { Console.WriteLine("C"); } } class D : C { public static void Main(String[] args) { A a = new D(); // a.M(); // doesn't work B b = new D(); b.M(); C c = new D(); c.M(); D d = new D(); d.M(); } } ``` When I execute the Java code, I got `C-C-C` whereas C# returns `B-C-C`. To me C#'s result makes more sense, as reference B invokes its own method. - What's the logic behind the Java designer's decision to print `C-C-C` instead of `B-C-C`? I mean, why reference B uses the overriding method in C? What's the advantage of this approach? - How can I change Java code to print out `B-C-C` just like C# does? I mean, how can I teach java to invoke the method of the exact reference it uses? - How can I change C# code to print out `C-C-C`? I mean, how can I teach C# to invoke the overriding method?