2016-03-21 6 views
0

以下のコードはエラーを生成し、コンパイルしません。しかし、キーワードoverrideを削除すると、警告のみが生成され、コンパイルされ、上書きされます。オーバーライドによって警告が生成され、オーバーライドするとき、overrideキーワードがエラーを生成するのはなぜですか?

論理的な説明はありますか?

class Baseclass 
{ 
    public void fun() 
    { 
     Console.WriteLine("Hi "); 
    } 

    public void fun(int i) 
    { 
     Console.Write("Hello "); 
    } 
} 


class Derived : Baseclass 
{ 
    public override void fun() 
    { 
     Console.Write("Bye "); 
    } 
} 


class MyProgram 
{ 
    static void Main(string[] args) 
    { 
     Derived d; 
     d = new Derived(); 
     d.fun(); 
     d.fun(77); 
     Console.Read(); 
    } 
} 

答えて

2

C#では、仮想でマークされたメソッドのみをオーバーライドできます。あなたが関数のシグネチャでoverrideを入れると、エラーが発生するので、存在しないベース・クラスに一致する仮想メソッドが必要です(署名をし、タイプの両方を返す)コンパイルし、代わりに

class Baseclass 
{ 
    public virtual void fun() 
    { 
     Console.WriteLine("Hi "); 
    } 
} 


class Derived : Baseclass 
{ 
    public override void fun() 
    { 
     Console.Write("Bye "); 
    } 
} 

これを試してみてください。

BaseClassのメソッドを実際に隠すオーバーライドキーワードを削除すると、オーバーライドされません。この場合、コンパイラは警告を出すだけでコンパイルを続けます。

オーバーライドし、隠れて参照してくださいOverriding vs method hidingとの間にはほとんど差が詳細はあり

+0

OK。だから、 'new'キーワードが使われるように動作しますが、そうはしません)。今、私はこの問題を理解しています。ありがとう! –

+0

'new'キーワードは、メソッドを隠したい場合にだけ置く必要があります。オーバーライドする場合は、基本クラスのメソッドを仮想としてマークします。メソッドを非表示にすると、多態的な動作は表示されません。 –

0

のC#を使用すると、派生クラスでオーバーライドされるメンバーをマークすることができますキーワードvirtualが含まれています。

ドキュメントで述べたような理由がある:デフォルトでは

、メソッドは非仮想です。非仮想メソッドをオーバーライドすることはできません。

なぜ言語設計者は、メソッドをオーバーライドできることを明示的に指定する必要があるのですか?私はそれらを話すことはできませんが、誤ってメンバーを無効にすることを避けるための安全な方法をプログラマーに与えたかったのは明らかです。それはここで最も明白な勝利のようです。

したがって、クラスを設計するときは、表示するクラスを仮想としてオーバーライドすると便利です。

MSDNで詳しく読むことができます。

だから、基底クラスは次のようになります。もちろん

class Baseclass 
{ 
    public virtual void fun() 
    { 
     Console.WriteLine("Hi "); 
    } 

    public void fun(int i) 
    { 
     Console.Write("Hello "); 
    } 
} 

あなたにもint型を取るオーバーロードされたメソッドにvirtualを追加することができます。

+0

あなたが言ったことははっきりと真実です。コンパイラの振る舞いについて質問します) –

+0

'あなたはMSDNでもっと読むことができます.'それはC#関連のマークが付いているすべての質問について真実です;) –

関連する問題