2012-04-29 9 views
1
public void GetProps(Parent p){ 

    // want to access lots of child properties here 
    string childProp1 = p.prop1; 
    bool childProp2 = p.prop2; 
    bool childProp3 = p.prop3; 

} 

しかし、コンパイラはC#、親参照から子プロパティにアクセスする?

関数は、クラス親の異なるサブタイプにかかる「親が定義PROP1が含まれていない」と文句を言い。

すべてのサブクラスは、この

public override string prop1 { get; set; } 

を持ってこれを達成する方法はありますか?

EDIT: 私は今、私はすべての冗長なコードを削除し、1を作りたかった

if(p is Child0){ 
     Child0 ch = p as Child0; 

     // want to access lots of child properties here 
     string childProp1 = ch.prop1; 
     bool childProp2 = ch.prop2; 
     bool childProp3 = ch.prop3; 

}else if(p is Child1){ 
     Child1 ch = p as Child1; 

     // want to access lots of child properties here 
     string childProp1 = ch.prop1; 
     bool childProp2 = ch.prop2; 
     bool childProp3 = ch.prop3; 

}else if(...// and many more 

ような何かを行う場所ならば-elseifを質問をより明確にするために

I電流が巨人を持っていますこのすべてを処理できる関数基底クラス(Parent)で抽象性質は、その後、子クラスにそれらを実装するよう

+0

私は答えました。 –

+1

キーワードrefを変数パラメータとしてどのように使用していますか? –

+0

@DarrenDavies質問 –

答えて

4

すべて子クラスが(しかし、異なる実装を持つ)の性質を持っている必要があり場合は、それらを宣言する必要があります。

一部の派生クラスにこれらのプロパティがない場合、現在のGetPropsにはどのようなことが期待できますか?

EDIT:(親クラスのプロパティを宣言し)、より良いクラス設計を得ることができないあなたはC#4を使用している場合は、あなた間違いあなたは動的型付け使用することができます

public void GetProps(Parent p) { 
    dynamic d = p; 
    string childProp1 = d.prop1; 
    bool childProp2 = d.prop2; 
    bool childProp3 = d.prop3; 
    // ...  
} 

を私は」 dこれを最後の手段として扱います。

+0

申し訳ありませんジョン、私は良い作家ではありませんが、私は私の質問に詳細を追加しました。また、私は外部DLL上でこれにアクセスしているので、ソースにアクセスできません。 –

+0

@KevinBoyd:プロパティが実際に基本クラスにない限り、サブクラスに 'override'があることは疑いありません。 –

+0

Jon、継承ラインはかなり長いです。私はトップレベルの親のリファレンスを使用しています。例えば、Parent ---> SubP10 ----> SubP9 ---> SubP8 ...-----> Childなどです。いずれの親もprop1の定義を持つことができる。 –

0

プロパティが親と子の間の中間クラスで定義されていて、設計時にその中間クラスへの参照がない場合は、リフレクションを使用してプロパティ。しかし、あなたは単に親ではなく最も関連性の高いサブ親を使うべきであるように思えます。

+0

素敵なアイデア!例が助けになるでしょう!ジョンのようなリフレクションとダイナミックは、既存の選択肢のようです。 –

1

私はあなたの質問から理解したように、親クラスのオブジェクトから子クラスのメンバーにアクセスする必要があります。

この動作はOOPでは許可されていません。 Jon Skeetが抽象基本クラスを作成し、子クラスに必要なメンバーを実装する方法を提案することができます。

他の方法では、ベースコンストラクターを使用して派生クラスコンストラクターの基本クラスのメンバーに必要な値を割り当てることができます。私はあなたの問題を解決するかどうかはわかりません。しかし、例えば、次のスニペットを考えてみましょう:

public class BaseClass 
{ 
    public string FirstName = "Base Class"; 
    public string LastName = "Base Class"; 
} 

public class DerivedClass : BaseClass 
{ 
    public DerivedClass() 
    { 
     base.LastName = "Derived Class"; 
    } 
} 

internal class Tester 
{ 
    private static void Main(string[] args) 
    { 
     BaseClass objBaseClass = new BaseClass(); 
     Console.WriteLine("First Name : " + objBaseClass.FirstName); 
     Console.WriteLine("Last Name : " + objBaseClass.LastName); 

     DerivedClass objDerivedClass = new DerivedClass(); 
     Console.WriteLine("First Name : " + objDerivedClass.FirstName); 
     Console.WriteLine("Last Name : " + objDerivedClass.LastName); 

     BaseClass objBaseDerivedClass = new DerivedClass(); 
     Console.WriteLine("First Name : " + objBaseDerivedClass.FirstName); 
     Console.WriteLine("Last Name : " + objBaseDerivedClass.LastName); 

     Console.ReadKey(); 
    } 
} 

O/P ファーストネーム:基本クラス

姓:基本クラス

ファーストネーム:基本クラス

姓:派生クラス

ファーストネーム:ベースクラス

姓:派生クラス

私が助けてくれたら教えてください。私が正しくあなたを理解している場合

+0

Pank、説明のおかげで、このケースでは外部のライブラリにアクセスしていて、ソースを変更するアクセス権がありません。また、私は親の参照から子プロパティにアクセスしたいと思います。入ってくるオブジェクトはまだ子オブジェクトです。 –

0

( - 私はParentを想定していますがChild0Child1などが継承する基底クラスです。) - あなただけの親でprop1の宣言を逃しています。それは途中で取得されません、それは単にオーバーライドされます。

この例(「子文字列」を返す)を確認し、ParentClassインスタンスが必要なメソッドにchildが渡されることに注意してください。あなたは、それが本当に役立つだろう達成しようとしているものについて、より多くのコンテキストを与えることができれば - 私は大ざっぱな情報を与えることができる最高のよう

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ChildClass child = new ChildClass(); 
     Text = ParentClass.mymethod(child); 
    } 
} 

class ParentClass 
{ 
    public virtual string s { get { return "parent string"; } } 

    public static string mymethod(ParentClass parent) 
    { 
     return parent.s; 
    } 
} 

class ChildClass : ParentClass 
{ 
    public override string s { get { return "child string"; } } 
} 
関連する問題