2017-04-25 22 views
0

私はJavaで既に持っているコードのためにC#で同等のコードを作ろうとしています。 Javaコードは次のとおりです。C#の子クラスからの親クラスのメソッドへのアクセス

class Test 
{ 
     public static void main (String args[]) 
     { 
      C1 o1 = new C1(); 
      C2 o2 = new C2(); 
      System.out.println(o1.m1() + " " + o1.m2() + " " + o2.m1() + " " + o2.m2()); 
     } 

} 

class C1 
{ 
    void C1() {} 
    int m1() { return 1; } 
    int m2() { return m1(); } 
} 

class C2 extends C1 
{ 
    void C2() {} 
    int m1() { return 2; } 
} 

これは、出力1 1 2 2.を与えます。次に、このコードをC#用に記述しました。

class Program 
    { 
     static void Main(string[] args) 
     { 
      C1 o1 = new C1(); 
      C2 o2 = new C2(); 
      Console.WriteLine(o1.M1()+ " "+ o1.M2()+ " "+ o2.M1()+ " "+ ((C2)o2).M2()+ "\n"); 
      Console.ReadKey(); 
     } 
    } 

    public class C1 
    { 
     public C1() 
     { 
     } 
     public int M1() 
     { 
      return 1; 
     } 
     public int M2() 
     { 
      return M1(); 

     } 
    } 

    public class C2:C1 
    { 
     public C2() 
     {    
     } 
     public int M1() 
     { 
      return 2; 
     } 
    } 

これは、しかしながら、C2の遺伝M2としてプリント1 1 2 1 はC1でM1を呼び出し、C2ではないM1。マイナーな変更を加えてC2でM1を呼び出すにはどうすればいいですか?

+1

https://msdn.microsoft.com/en-us/library/9fkccyh4.aspx – Orangesandlemons

答えて

2

注:オーバーライドを許可するには、C#ではvirtualoverrideキーワードを使用する必要があります。 MSDN

仮想キーワードは、メソッド、プロパティ、インデクサ、またはイベント宣言を変更し、それが派生クラスでオーバーライドすることを可能にするために使用されます。

(私の太字)

class Program 
    { 
     static void Main(string[] args) 
     { 
      C1 o1 = new C1(); 
      C2 o2 = new C2(); 
      Console.WriteLine(o1.M1() + " " + o1.M2() + " " + o2.M1() + " " + ((C2)o2).M2() + "\n"); 
      Console.ReadKey(); 
     } 
    } 

    public class C1 
    { 
     public C1() 
     { 
     } 
     public virtual int M1() 
     { 
      return 1; 
     } 
     public int M2() 
     { 
      return M1(); 

     } 
    } 

    public class C2 : C1 
    { 
     public C2() 
     { 
     } 
     public override int M1() 
     { 
      return 2; 
     } 
    } 
関連する問題