2010-12-01 5 views
0

ベースクラスオブジェクトを使用して派生クラスのプロパティメンバーにアクセスする際に問題があります。CSharpのベースクラスオブジェクトから派生クラスプロパティメンバーへのアクセス

シナリオ:

public class BaseClass{ 
    public virtual Write(BaseClass data){ 
    } 
} 

public class DerivedClass : BaseClass{ 

    private string name: 

    public string Name {get {return name} set {name = value;} } 

    public override Write(BaseClass data){ 
    Console.println(data.Name); // gives me error here 
    } 

} 
+2

名が定義されないことをJSONまたはXMLにシリアライズしてから出力ができ

public virtual Write() 

またはWebBrowserコントロール

よう
public virtual Write(HtmlTextWriter writer); 

にBaseClassののsigntureを変更BaseClassにあります。 –

+0

これはできません。 'BaseClass data'が' DerivedClass'と同じ型であるとは期待できません。何を印刷すると思いますか? –

+1

また、 'Console.println'は存在しません。 'Console.WriteLine'は行います。 –

答えて

6

あなたが派生クラスのプロパティへのアクセスに問題を持っている理由は、基本クラスがそれらについて何も知らない(そしてもっと重要なすべきではない)ないということです。異なる派生クラスは、追加されたプロパティの異なるセットを持つことができます。基本クラスにこれを認識させることは、オブジェクト指向設計の重要な原則に反するであろう。そのような原則の1つは、Liskov Substitution Principleです。

0

前述のように、名前はBaseClassには存在しません。

"name"を基本クラスに移動するか、継承したクラスの特定のデータを書き込む個別の書き込みメソッドを作成します。

public class DerivedClass : BaseClass{ 

    public string Name { get; set; } 

    public override void Write(DerivedClass data) { 
     Console.printLn(data.Name); 
     base.Write(data) 
    } 

    // why print a different instance, just write self 
    public void Write() { 
     Console.printLn(this.Name); 
     base.Write(this) 
    } 

} 

クラスは、あなただけの自分自身に書き込みを呼び出すことができたときに書くために別のクラスインスタンスを受け入れる理由はわかりません。あなたは、単にデバッグしたい場合、あなたは自分のコンソールに

関連する問題