4
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;

}

ただし、コンパイラは不平を言います

「親に定義 prop1 が含まれていません」

この関数は、Class Parent のさまざまなサブタイプを受け取ります。

すべてのサブクラスはこれを持っています

public override string prop1 { get; set; }

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

編集: 質問をより明確にするために

私は現在、次のようなことをする巨大なif-elseifを持っています

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 

ここで、冗長なコードをすべて削除し、これらすべてを処理できる 1 つの関数を作成したいと考えました。

4

5 に答える 5

7

すべての子クラスにプロパティが必要な場合(実装は異なります)、それらを基本クラス ( ) で抽象Parentプロパティとして宣言してから、子クラスに実装する必要があります。

一部の派生クラスがこれらのプロパティを持たない場合、現在のクラスに何を期待しますGetPropsか?

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

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

これは最終手段としますが…。

于 2012-04-29T08:08:36.363 に答える
1

あなたの質問から理解したように、あなたは親クラスのオブジェクトから子クラスのメンバーにアクセスしたいと思っています。

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

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

 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名:基本クラス

姓:基本クラス

名:基本クラス

姓:派生クラス

名:基本クラス

姓:派生クラス

それが助けになるなら、私に知らせてください。

于 2012-04-29T08:53:14.697 に答える
0

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

于 2012-04-29T08:44:55.140 に答える
0

私があなたを正しく理解していれば(- etc が継承するParent基本クラスであると想定しています)-親での宣言が欠落しているだけです。邪魔になることはありません。単にオーバーライドされます。Child0 Child1prop1

この例 (「子文字列」を返す) を確認し、インスタンスchildを期待するメソッドに渡されることに注意してください。ParentClass

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"; }  }
}
于 2012-04-29T11:44:04.630 に答える