2017-08-28 6 views
-6

私は実際のクラスをサブクラス化する必要があります。抽象クラスではありません。私は新しい行動が必要です。メインプログラムでC#の継承が機能しません

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int Calc(int a) 
     { 
      return a + this.Cal(); 
     } 

     public int Cal() 
     { 
      return 2; 
     } 
    } 

    public class ChildClass : ParentClass 
    { 
     public int Cal() 
     { 
      return 1; 
     } 
    } 
} 

、私は次のことを試してみました:

ChildClass childClass = new ChildClass(); 
int a = childClass.calc(3); 

aの値は、しかし、5ではなく、4

+1

非常に混乱しやすいコードです。 – JonH

+0

[上書きと新しいキーワードを使用するタイミングを知る](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override- and-new-keywords) –

+0

固定命名規則... – JonH

答えて

4

あなたにcal()メソッドをマークする必要がありますvirtualparentclassおよびchildclassである。

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int calc(int a) 
     { 
      return a + this.cal(); 
     } 

     public virtual int cal() 
     { 
      return 2; 
     } 
    } 

    public class childClass : ParentClass 
    { 
     public override int cal() // same name and firm 
     { 
      return 1; 
     } 
    } 
} 
+0

同名で会社ですか?それは何ですか? – JonH

+0

@JonH - それは知っているが、OPにもある。おそらくコピー/ペーストして、適切な場所にバーチャル+オーバーライドを追加しました。 – Igor

+0

それは私がやったことです:)。私は彼がメソッドが親と同じ署名を持っていることを意味していると仮定します。 – AlexDrenea

1

あなたはpublic int cal() { return 2; }のようなメソッドを定義するときに基本的に、あなたは永遠にこのようなことになるだろうと言っています。このように、クラス内で呼び出されると(return a + this.cal())、別の実装を探すことさえできません。実装をオーバーライドするオプションが必要な場合は、メソッドをvirtualとマークする必要があります。子クラスで、メソッドをオーバーライドする場合は、overrideキーワードを使用してオーバーライドを明示的に行う必要があります。

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int calc(int a) { return a + this.cal(); } 
     public virtual int cal() { return 2; } 
    } 

    public class childClass : ParentClass 
    { 
     public override int cal() 
     { 
      return 1; 
     } 
    } 
} 
+0

2つのもの。 1)私はあなたの第1行のメソッド定義に 'virtual'を含めるつもりはないと確信しています。そのミスは、文章全体をむしろノブに混乱させます。 2)オーバーライドクラス*は、 'new'キーワードを使って自身の振る舞いを変更することもできます。 – Igor

+0

ありがとう!私は、実際にはなかった。一定! 'new'キーワードがデフォルトの動作です(基本的に警告を隠すだけです)。 'new'キーワードを使用するオーバーライドクラスは、このクラスのコンテキストでメソッドが呼び出されたときにのみ機能します。たとえば、上記の例で 'new'キーワードを使用すると、' childClass child = new childClass; child.cal(); 'は期待通りに1を返します。しかし、 'ParentClass parent = new childClass; parent.cal(); 'は結果2になります。 –

+0

ありがとう、私の英語は非常に貧しいです、私は非バーチャルまたは抽象メソッドを上書きすることはできません。 https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance –

関連する問題