-2

クラスの次の構造があります。

class A
{
    IEnumerable<int> a;
}

class B:A
{
    IEnumerable<int> b;
}

class C:B
{
    IEnumerable<int> c;
}

class D:C
{
    IEnumerable<int> d;
}

class E
{
    static void Main()
    {
        A a = new A();
    }
}

ここで、作成されたオブジェクト a からすべてのフィールド a、b、c、d にアクセスしたいと考えています。そうすることは可能ですか?

また、この継承ツリーが成長するシナリオが存在する可能性もあります。では、これをどのように処理すればよいでしょうか。つまり、今後コードを変更することなく、新しいクラスのフィールドにアクセスできます。

4

4 に答える 4

5

のインスタンスに存在しないため、フィールドbc、またはにアクセスできません。dA

これらすべてのフィールドを持つクラスを作成する場合は、次の 1 つがありますD。代わりにインスタンスを作成しますD

編集:代わりに何を意味している可能性があるかについての考えられる考え:

  1. A a = new D()から子型のプロパティを作成してアクセスしDたいという意味かもしれませんmain()Dこれはキャストで可能ですが、最初に変数を として宣言するだけの方が簡単です。

  2. Aクラスのコードが class のプロパティを参照できるようにしたいという意味かもしれませんD。これはリフレクションまたはキャスティングで直接可能ですが、デザインが非常に壊れやすく読みにくいため、お勧めできません。より良い解決策は、ユーザーオーバーライドです。この場合、クラス内のメソッドA( 内のプロパティを使用しないD) をクラス内でオーバーライドしDて、より具体的な機能を持たせることができます。

  3. 、、およびnew A()のすべてのプロパティが必要な場合があります。この場合、基本的な理解が間違っています。継承は逆に機能します。classには、 class ではなく、4 つのプロパティすべてがあります。abcdDA

さらに編集:

コードを読み直すと、さらに問題があります。すべてのフィールドは暗黙的privateです (これがデフォルトであるため)。したがって、継承チェーン内の他のクラスからフィールドにアクセスすることはできません。protectedそれらを表示するには、またはpublic代わりにとしてマークする必要があります。

于 2013-06-04T13:39:37.417 に答える
1
D d = new D();

これで、a、b、c、d にアクセスできるようになりました。オブジェクト a には IEnumerable b、または c または d の定義が含まれていません。タイプ D のオブジェクトのみが IEnumerables のすべてのインスタンスの定義を含んでいます

于 2013-06-04T13:45:14.467 に答える
1

A のインスタンスはプロパティ a のみを持ちます。タイプ A の変数を定義してタイプ B のインスタンスに割り当てることはできますが、そこからプロパティ b にアクセスすることはできません。

`A a = 新しい A(); //aa が利用可能

A b = 新しい B(); // .a のみが利用可能ですが、継承により代入が機能します`

于 2013-06-04T13:42:16.203 に答える