2017-11-26 19 views
-3

私は明確にする必要があること。継承を使用する場合、私は仮想またはオーバーライドキーワードを使用せずにメソッドをオーバーライドできます。私のプログラムも実行され、正しい出力が得られます。それでは、私たちに継承があるのに、なぜオーバーライドコンセプトを持っているのですか?それはどう違うの?これは、この導出され継承とオーバーライド。 C#の違いは?

+1

'a'(' InheritanceDemo b = new A1(); ')の代わりに' b'を 'InheritanceDemo'と宣言してください。 – Dmitry

答えて

0

関数のオーバーライドベース

されている

static void Main(string[] args) 
{ 

InheritanceDemo a = new A1(); 
A1 b = new A1(); 
a.Mymeth(); 
b.Mymeth(); 

} 

出力:ここ

は私のコード

class InheritanceDemo 
{ 
public void Mymeth() 
{ 
Console.WriteLine("this is base"); 
} 
} 

class A1 : InheritanceDemo 
{ 

public void Mymeth() 
{ 

Console.WriteLine("this is derived"); 
} 
} 

主な方法であり、派生クラス関数が基本クラス関数より多くの、または異なるジョブを実行する必要がある場合に必要です。

問題が大きい大規模なアプリケーションでは、これらの概念は重要になります。まず、抽象クラスを作成します(これは直接的な実装ではなく、物事の考え方を示しています)。これらの抽象クラスには、グループのメンバーが実装しなければならない仮想メソッド(メンバー関数)が含まれます(仮想メソッドを派生クラスで定義する必要があるため)。 私はあなたが私の意見を持っていると思う... :)

+0

ありがとうございました!はい、それを得ました:) – javababy

0

なぜ出力が「正しい」と思いますか?継承を使用すると、正しいを継承して関数を呼び出し、ではなくを基本クラスのメソッドとしたいとします。そしてそれはあなたがvirtual/overrideで定義するものです。

+0

はい私はそれを得ました。ありがとうございました! – javababy

0

これをコンパイルすると、警告が表示されます。CS0108

警告を無視しないでください。実際に、コンパイルを警告するのではなくエラーに設定できる場合は、警告は、一般的に、悪いことや不明瞭なことをしたことを示す印です。彼らはエラーではありません。なぜなら、最初の見た目が悪いか不明瞭なものを行う良い理由があるかもしれないからです。しかし、上書きするのではなく隠す場合には、newがあります。

ここにあるものはオーバーライドではありませんが、期待しているように、一般的にはオーバーライドが望ましいでしょう。これは、このコードがコンパイラの警告を生成する理由の一部です。

私のプログラムも実行していて、正しい出力を与える

多分それは正しいのですが、あなたはオーバーライドを期待あれば、それは正しくありません。オーバーライドしている場合は、両方から出力される必要があります。

正しい場合は、一般的に上書きが予想されるため、デザインが悪いです。 A1.Mymethを「public new void Mymeth()」と定義するように変更すると警告を止めることができます。これは「本当に間違っていることを意味する」というフラグを立てる方法ですが、自分自身を説明する必要がある場合は、それは悪い兆候です。非表示の方法は、一般的にあなたのもとで基底クラスを変更している人があなたの手を強要したときにのみ行われます。何らかの相互運用性のために名前を一致させる必要があります。

+0

ありがとうございました。私はちょっとばかだった。私は今ポイントがある! – javababy

関連する問題