Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问基类中的派生类成员_C#_Inheritance - Fatal编程技术网

C# 访问基类中的派生类成员

C# 访问基类中的派生类成员,c#,inheritance,C#,Inheritance,我想访问基类中的派生类成员: 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 =

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

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;
}
我不确定这些是可能的,但我希望你有任何想法来解决它


谢谢你

你不能用你的例子来说明这一点。基类对派生类的实现一无所知

但是,您可以在基类中定义一个虚拟方法或属性,该方法或属性可以在派生类中实现,并返回所需的值模板方法模式:

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; } }
}
您可以通过动态键入来实现:

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

现在还不清楚您想要实现什么,但是您可能希望创建一个具有所有子类都可以实现的抽象属性的抽象类。请注意,您不能使字段抽象


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

将您的方法设置为虚拟,并在派生类中重写它。您可以调用方法的基类实现,但也可以添加特定于派生类的新行为:

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();
    }
}
除非每个A都有一个FieldTest属性,否则如果不检查A是否实际上是B,就无法执行此操作


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

您不应该从基类访问派生类成员。相反,您的设计应该允许更派生的类型提供实现,并反过来调用基类。或者,如果调用在多个派生类型之间共享,那么逻辑应该属于基

因为您似乎需要使用单个方法执行调用,所以正常的重写应该可以工作。一个人为的例子

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() }
}

现在,若狗定义吃,那个么动物就不应该指望执行派生的。吃。相反,Eat应该在Animal中定义,并由派生类调用

我认为模板方法是一个更好的选择。@FrederikHeysels-模板模式对于一种方法来说似乎有些过分。为什么不干脆做一个覆盖呢?我已经发布了我的解决方案,但出于性能考虑我更喜欢你的解决方案我需要这些,因为我正在使用Emit代码动态创建类,所以我更喜欢实现基类中的所有逻辑,然后派生它,而不是动态创建方法;因为答案是错误的。使用接口、抽象实现和获取重写的方法/结果。。。还有一种设计模式可以执行类似的操作,称为模板方法see。如果你使用的语言有反射的可能性,这也是解决这个问题的一种方法。用“显然”开始你的答案也可能会引起一些反对票。@Frederik。。。你的代码以前没有出现过。你不能用你的例子来展示它。基类对派生类的实现一无所知。。。这就是我所看到的一切。在这种情况下,我收回它。
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() }
}