访问基类中的派生类成员

时间:2013-02-26 16:17:20

标签: c# inheritance

我想访问base classe中的派生类成员:

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

我不确定这些是否可行,但我希望你有任何想法来解决它。

谢谢

7 个答案:

答案 0 :(得分:6)

嗯,可以使用动态输入执行此操作:

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

......但这是一个非常奇怪的要求。如果this实际上只是 A的一个实例,或者实际上是没有这样一个成员的不同子类的实例,您会发生什么?基本上这是一个狡猾的设计。

目前尚不清楚您要实现的目标,但您可能希望将A作为抽象类,并使用 abstract 属性,所有子类都可以实行。 (注意,你不能把字段抽象......)

如果这没有帮助,请首先详细说明您尝试这样做的原因。

答案 1 :(得分: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; } }
}

答案 2 :(得分:1)

基类无权访问派生类的字段。需要这样做可能是一个应用程序结构错误。

答案 3 :(得分: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();
    }
}

答案 4 :(得分:0)

除非每个A都有FieldTest属性,否则如果A实际上不是B,则无法执行此操作。

var b = a as B;
if (b != null)
{
   b.FieldTest;
}

答案 5 :(得分: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中定义并由派生类调用。

答案 6 :(得分:0)

感谢您的回复! 我试过这个解决方案并且效果很好

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

        foreach (FieldInfo fieldInfo in t.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
        {
            Console.WriteLine("{0}\t{1}:{2}", fieldInfo.FieldType.Name, fieldInfo.Name, fieldInfo.GetValue(this));

        }

        Console.ReadLine();
    }