7

私は2つのクラスAとBを持っています.BはAから派生しています.

両方のクラスには、同じ署名を持つメソッドがあります。それらは、Java & c# では次の方法で呼び出されます-->


JAVAの場合:

class A
{
    public void print()
    {
        System.out.println("Inside Parent");
    }
}

class B extends A
{
    public void print()
    {
        System.out.println("Inside Child");
    }
}

class test4
{
    public static void main(String args[])
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
    }
}

このプログラムは、次の出力を生成します:-

Inside Child
Inside Child

C# の場合:

class A
{
    public void print()
    {
        System.Console.WriteLine("Inside Parent");
    }
}

class B : A
{
    public void print()
    {
        System.Console.WriteLine("Inside Child");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        B b1=new B();
        b1.print();
        A a1=new B();
        a1.print();
        System.Console.Read();
    }
}

このプログラムは、次の出力を生成します:-

Inside Child
Inside Parent

出力が異なるのはなぜですか?

4

3 に答える 3

16

Java では、メソッドはvirtualデフォルトです。
C# では、メソッドはデフォルトではありません。 virtual

したがって、C# コードが Java コードと同じように動作するようにするvirtualには、基本クラスとoverride派生クラスでメソッドを作成します。

または、Java コードが C# コードと同じように動作するようにするfinalには、基本クラスでメソッドを作成します。

于 2013-06-06T11:35:03.503 に答える
6

C# の場合、親メソッドを仮想として、子メソッドをオーバーライドとして作成する必要があります。

class A
{
public virtual void print()
{
System.Console.WriteLine("Inside Parent");
}
}
class B : A
{
public override void print()
{
System.Console.WriteLine("Inside Child");
}
}
class Program
{
public static void Main(string[] args)
{
B b1=new B();
b1.print();
A a1=new B();
a1.print();
System.Console.Read();
}
}
于 2013-06-06T11:34:26.753 に答える
2

この行:

  A a1=new B();

ここでは、C# でメソッドを非表示にする例があると思います。おそらく、オーバーライドされたメソッドを明示的に宣言する必要があります (たとえば、Java では @Override アノテーションを使用します)。

于 2013-06-06T11:35:39.660 に答える