2011-08-25 9 views
5

1)以下のコードが異なるのはなぜですか?JavaとC#の違いは何ですか?

のC#:

class Base 
{ 
    public void foo() 
    { 
    System.Console.WriteLine("base"); 
    } 
} 

class Derived : Base 
{ 
    static void Main(string[] args) 
    { 
    Base b = new Base(); 
    b.foo(); 
    b = new Derived(); 
    b.foo(); 
    } 
    public new void foo() 
    { 
    System.Console.WriteLine("derived"); 
    } 
} 

のJava:

class Base { 
    public void foo() { 
    System.out.println("Base"); 
    } 
} 

class Derived extends Base { 
    public void foo() { 
    System.out.println("Derived"); 
    } 

    public static void main(String []s) { 
    Base b = new Base(); 
    b.foo(); 
    b = new Derived(); 
    b.foo(); 
    } 
} 

2)一つの言語から別のものに移行する場合、我々は円滑な移行のために確保するために必要なものは何ですか。

+5

正確にあなたの質問は何ですか?同じ言語ではないため、コードが異なります。この答えは十分ではありませんか? – RoflcoptrException

+0

この質問はどのように宿題と異なるのですか? – Filburt

+0

@フィルバート:答えを見てください。それは宿題に関する質問ではない –

答えて

9

Javaの場合、メソッドはデフォルトでvirtualです。 C#では、仮想メソッドに明示的にマークを付けなければなりません。
次のC#コードは、Javaコードと同等です - 派生クラスで基本クラスとoverridevirtualの使用を注意してください:あなたが投稿

class Base 
{ 
    public virtual void foo() 
    { 
     System.Console.WriteLine("base"); 
    } 
} 

class Derived 
    : Base 
{ 
    static void Main(string[] args) 
    { 
     Base b = new Base(); 
     b.foo(); 
     b = new Derived(); 
     b.foo(); 

    } 

    public override void foo() 
    { 
     System.Console.WriteLine("derived"); 
    } 
} 

C#のコードは、クラスDerived方法fooを隠します。これは継承に問題を引き起こすため、通常はやりたくないことです。あなたが投稿したクラスを使用して

、次のコードが出力の異なるもの、それは常に同じインスタンスですけれども:

Base b = new Derived(); 
b.foo(); // writes "base" 
((Derived)b).foo(); // writes "derived" 

私は両方のケースで「由来する」意志の出力の上に設けられた固定コード。

7

ここにメソッドを隠しているので、C#コードは警告とともにコンパイルされます。

Javaでは、クラスメソッドは常に仮想ですが、C#ではそうではなく、明示的に '仮想'としてマークする必要があります。

のC#で

は、あなたがこれを行う必要があるでしょう:

public class Base 
{ 
    public virtual void Foo() 
    { 
     Console.WriteLine ("Base"); 
    } 
} 

public class Derived : Base 
{ 
    public override void Foo() 
    { 
     Console.WriteLine ("Derived."); 
    } 
} 
関連する問題