2011-10-21 10 views
3

を上書きは、私はちょうど右にジャンプします、プロパティのアクセサ

と仮定オーディオファイルはそうのような抽象クラスです。

abstract class AudioFile 
{ 
    public string Title { get; set; } 
} 

は今、ほとんどの場合、a.Titleを使用するために最適ですAudioFileを継承する他のクラス。しかし、MPEGファイルの場合には、これはID3変数に別のオブジェクトに格納されています。私が望む何

class MPEG : AudioFile 
{ 
    private ID3 id3; 

    public new string Title { 
     get { 
      return id3.Title; 
     } 
     set { 
      id3.Title = value; 
     } 
    } 
} 

class WMA : AudioFile 
{ 

} 

は、次の操作を実行することです:

AudioFile a; 

if(isMPEG) { 
    a = LoadMPEG(); // Returns a new MPEG instance. 
} else 
if(isWMA) { 
    a = LoadWMA(); // Return a new WMA instance. 
} 

Console.WriteLine(a.Title); 
// Other stuff with a. 

私は出力を期待しますMPEGかWMAかに関わらず、その曲のタイトル。しかし、MPEGの場合、期待通りに動作しません(id3オブジェクトを使用していないため)。それが動作する唯一の方法は次のとおりです。

if(isMPEG) { 
    MPEG a = LoadMPEG(); // Returns a new MPEG instance. 
    Console.WriteLine(a.Title); 
    // Other stuff with a. 
} else 
if(isWMA) { 
    WMA a = LoadWMA(); // Return a new WMA instance. 
    Console.WriteLine(a.Title); 
    // Other stuff with a. 
} 

これは私が望むものではありません。私がしたいことをやる方法についてのアイデアは?

答えて

4

抽象クラスのプロパティーvirtualを作成して、異なる動作が必要な場合は派生クラスがそれをオーバーライドできるようにします。お使いのバージョンで

abstract class AudioFile 
{ 
    public virtual string Title { get; set; } 
} 

class MpegFile : AudioFile 
{ 
    public override string Title { /* your custom getter and setter */ } 
} 

AudioFile file = new MpegFile(); 
string title = file.Title; // will use override 

、あなたは非仮想抽象クラスのプロパティを残し、newとして派生クラスのプロパティをマーク。これにより、派生クラスの参照を介してカスタム動作のみを使用することができます。あなたは、ベースを介して多態的な振る舞いを体験する能力を失います。 new修飾子は、派生参照を介してのみを非表示にします。ベース参照はベース動作を使用します。

AudioFile file = new MPEG(); // will use base behavior for non-virtual methods 
MPEG file = new MPEG(); // will use derived behavior when non-virtual methods are hidden by new 

あなたは、Javaの背景から来て起こるかもしれません。 C#では、メンバーはデフォルトでは仮想ではありません。それらをvirtualとマークし、基本的な実装を多態的な方法で置き換えたり拡張したりするには、overrideを使用する必要があります。 (抽象クラ​​スの抽象メンバの場合は、virtualの代わりにabstractというキーワードを使用します)newキーワードは、基本メソッドが仮想ではないが既にその制限を見ている場合に便利です。

+0

偉大な答えは、魅力的なように働いた。ありがとう!そして、はい、私はJavaの背景から来ています。 :) –

関連する問題