0

基本クラスの派生クラス メンバーにアクセスしたい:

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        b.FieldTest = 5;
        b.MethodeTest();

    }
}

public class A
{
    public void MethodeTest()
    {
        //will return B
        Type t = this.GetType();
        Console.WriteLine(t);

        var temp = ???.FieldTest;
        //i want that these return 5
        Console.WriteLine(temp);
        Console.ReadLine();
    }
}

public class B:A
{
    public int FieldTest;
}

これらが可能かどうかはわかりませんが、解決するためのアイデアがあれば幸いです。

ありがとうございました

4

6 に答える 6

6

動的型付けでそれを行うことができます:

dynamic dynamicThis = this;
var temp = dynamicThis.FieldTest;

...しかし、それは非常に奇妙な要件です。this実際にのインスタンス、または実際にそのようAなメンバーのない別のサブクラスのインスタンスである場合、どうなると思いますか?基本的にそれは危険なデザインです。

何を達成しようとしているのかは明確ではありませんが、すべてのサブクラスが実装できる抽象プロパティを使用して抽象クラスを作成Aすることをお勧めします。(フィールドを抽象化することはできないことに注意してください...)

それでも問題が解決しない場合は、そもそもなぜこれを行おうとしているのかについて詳しく教えてください。

于 2013-02-26T16:19:29.493 に答える
1

あなたがあなたの例によってそれを示している方法でそれをすることはできません。基本クラスは、派生クラスの実装について何も知りません。

ただし、実行できることは、基本クラスで仮想メソッドまたはプロパティを定義することです。これは、派生クラスで実装でき、目的の値(テンプレートメソッドパターン)を返します。

public class A
{
   protected virtual int FieldTest { get { return 0; } }

   public void TestMethod()
   {
        Console.WriteLine ("FieldTest: " + FieldTest);
   }

}

public class B : A
{
   protected override int FieldTest { get { return 5; } }
}

public class C : A 
{
   protected override int FieldTest { get { return 10; } }
}
于 2013-02-26T16:19:11.863 に答える
1

基本クラスは、派生クラスのフィールドにアクセスできません。これを行う必要があるのは、おそらくアプリケーション構造の間違いです。

于 2013-02-26T16:22:16.747 に答える
0

メソッドを仮想化し、派生クラスでオーバーライドします。メソッドの基本クラスの実装を呼び出すことができますが、派生クラスに固有の新しい動作を追加することもできます。

public class A
{
    public virtual void MethodeTest()
    {
        //will return B
        Type t = this.GetType();
        Console.WriteLine(t);
        Console.ReadLine();
    }
}

public class B:A
{
    public int FieldTest;

    public override void MethodeTest()
    {
        base.MethodeTest(); // base class implementation

        Console.WriteLine(FieldTest); // FieldTest is available here
        Console.ReadLine();
    }
}
于 2013-02-26T16:20:23.443 に答える
0

everyAにプロパティがない限り、が実際に であるFieldTestかどうかを確認せずにこれを行うことはできません。AB

var b = a as B;
if (b != null)
{
   b.FieldTest;
}
于 2013-02-26T16:21:09.443 に答える
0

基本クラスから派生クラス メンバーにアクセスする必要はありません。代わりに、より派生した型が実装を提供し、次に基底クラスを呼び出すことができるように設計する必要があります。または、呼び出しが複数の派生型で共有されている場合、ロジックはベースに属している必要があります。

単一のメソッドで呼び出しを実行する必要があるように見えるため、通常のオーバーライドが機能するはずです。わざとらしい例、

class Animal
{
   public virtual bool Speak() { //return true.  Assume all animals make a sound }
}

class Dog : Animal
{
  public override bool Speak() { //Bark and return base.Speak() }
}

ここで Dog が定義する場合Eat()、Animal は実行するように見えるべきではありませんderived.Eat。代わりに、Eat を Animal で定義し、派生クラスで呼び出す必要があります。

于 2013-02-26T16:37:25.470 に答える