2012-10-04 7 views
6

「DisplayTitle」というメソッドを実装する「Parent」という抽象親クラスがあります。このメソッドを "Parent"を継承する各サブクラスで同じにしたい - サブクラスが独自の "DisplayTitle"メソッドを実装しようとすると、コンパイルエラーが発生します。どのようにC#でこれを達成できますか?私はJavaを信じて、メソッドを「final」とマークするだけですが、C#で代替案を見つけることはできません。私は "封印された"と "上書きする"といじり回ってきましたが、私が探している振る舞いを得ることはできません。例えばC#サブクラスがメソッドを上書きしないようにする

、このコードで:

using System; 

namespace ConsoleApplication1 
{ 
    class Parent 
    { 
     public void DisplayTitle() { Console.WriteLine("Parent's Title"); } 
    } 

    class ChildSubclass : Parent 
    { 
     public void DisplayTitle() { Console.WriteLine("Child's Own Implementation of Title"); 
    } 

    static void Main(string[] args) 
    { 
     ChildSubclass myChild = new ChildSubclass(); 
     myChild.DisplayTitle(); 
     Console.ReadLine(); 
    } 
    } 
} 

私は「ChildSubClassは」「DISPLAYTITLE」を上書きすることはできませんというコンパイルエラーを受け取りたいです。私は現在警告を受けていますが、これは私ができるはずのものであり、メソッドにラベルを付けるための適切な属性がわからないようです。

答えて

10

。私はJavaを信じて、メソッドを「final」とマークするだけですが、C#で代替案を見つけることはできません。

ラフ同等のC#でsealedですが、普通は仮想メソッドのためにそれを必要とする - とあなたのDisplayTitle方法は、仮想ではありません。

それはChildSubclassDisplayTitleをオーバーライドではないことに注意することが重要だ - それはそれを隠しています。 Parentへの参照のみを使用するコードは、その実装を呼び出すことになりません。コードとしては-であると、あなたはChildSubclass方法にnew修飾子を追加するように助言コンパイル時の警告を受ける必要があることを

注:

public new void DisplayTitle() { ... } 

することはできません停止派生クラス既存のメソッドを隠すことから、派生クラスの作成を完全に防ぐためにクラス自体を密封する以外に...派生型を直接使用しない呼び出し側は気にしません。

あなたのは本当ですかここに関心がありますか?誤った誤用、または故意の問題?

EDIT:あなたのサンプルコードの警告のようなものになるだろうことに注意してください:私はあなたがエラーに警告を有効に提案し、それはそれらを無視するのは難しいです

Test.cs(12,19): warning CS0108: 
     'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited 
     member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword 
     if hiding was intended. 

:)

+1

私の本当の懸念は、誤った誤用であると思います。私は "TurnOn"と "TurnOff"メソッドを持つ別のプロジェクトに抽象クラスを持っています。詳細にあまり浸透することなく、このクラスは実世界のオブジェクトを表すために複数回サブクラス化されます。ただし、これらのデバイスはすべて同じ方法でオン/オフされます。私は自分自身や他の人が、ある種の警告なしで個々のデバイスのコマンドをオフ/オンにするようなことはしたくない。 – user1720817

+0

@ user1720817:まあ、警告になるだろう。あなたのサンプルコードからの警告を私の答えに編集します... –

+0

うん、警告があります:それはコンパイル時のエラーになりたいと思う私のOCDです。これを書く時間をとってくれてありがとう! – user1720817

1

サブクラスがクラス、プロパティ、またはメソッドをオーバーライドしないようにするには、sealed修飾子を使用します。封印して使用するとうまくいかないのですか?私はC#でこれを実現するにはどうすればよい

http://msdn.microsoft.com/en-us/library/88c54tsw.aspx

+0

私が使用している場合: "public sealed void DisplayTitle(){Console.WriteLine("親のタイトル ");}"コンパイルエラーが発生しました - "ConsoleApplication1.Parent.DisplayTitle()はシールされません。オーバーライド "。 – user1720817

2

を派生クラスあなたのメソッドをオーバーライドすることはできません、あなたはそれを宣言していません仮想。 C#ではJavaと比べてどのように違いがあるのか​​、どのメソッドもJavaでは仮想的であることに注意してください。 C#では明示的にキーワードを使用する必要があります。

派生クラスの缶あなたのメソッドを再度同じ名前で使用してください。これはおそらくあなたが話しているコンパイルの警告です。 新しいキーワードを使用すると、警告が抑制されます。このメソッドは、元のメソッドをオーバーライドすることはありません。基本クラスコードは、派生クラスのコードではなく、元のメソッドを常に呼び出します。

+0

+1、特にC#/ Javaの違い。 –

0

私は、あなたが望むものがC#のメソッド修飾子キーワードでは使用できないと確信しています。

封印は、祖先クラスの仮想メソッドをオーバーライドする場合にのみ適用され、がさらに無効になります。が上書きされます。

+0

良い点ですが、OPはクラスを継承して基本メソッドを隠すのを防ぎたいと考えています。それだけでは不可能です。 –

+0

これは私が最も混乱している部分の一部だと思われます - なぜ継承されたメソッドを封印できますか? "ベース"クラスではできません。 – user1720817

+0

@MichaelSallmen、私は「あなたが望むものは不可能だ」と述べました。あなたの混乱はどこですか? – Jace

関連する問題