Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java inheritance vs. C# inheritance

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?
like image 864
prosseek Avatar asked Nov 10 '12 14:11

prosseek


People also ask

What is difference between inheritance in C and Java?

When you create a class in Java, it automatically inherits from the Object Class. However, in C++, there is a forest of classes; when we create a class that does not inherit from another, we are creating a new tree in the forest. The Test class inherits from the Object class by default, as shown in the Java example.

Why inheritance in Java is different of C++?

In java all methods are virtual by default. In C++, we have to specify the virtual keyword. In C++, we can use the multiple inheritance. In Java, we cannot create multiple inheritance directly.

Why Java does not support multiple inheritance but C++ does?

Java is a very simple language, and the inheritance model is simpler too. If you need to "inherit" from multiple sources you have to use interfaces which don't have these problems but they are also less flexible. cont. C++ doesn't have interfaces, because interfaces usually don't make sense in C++.

Is inheritance possible in C?

No it doesnt. C is not an Object Oriented language. Inheritance is a property of OO languages.


1 Answers

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");
    }
}
like image 178
Luiggi Mendoza Avatar answered Sep 22 '22 06:09

Luiggi Mendoza