从C#中的抽象父类调用子实例的实现函数

时间:2017-08-15 21:44:17

标签: c# instance abstract-class base

这是:

abstract class IA
{
  public virtual void ChangePropertyOfAIChild()
  {
    b.value = true;
  }
}
...
class B:IA
{
   bool value;

}

class C:IA
{
   bool value;
}
....
///main
IA newBInstance = new B();
newBInstance.ChangePropertyOfAIChild();

IA newCInstance = new C();
newCInstance .ChangePropertyOfAIChild();

/////

从基础抽象类中调用已经实现的函数并更改它的值是什么? 谢谢!

2 个答案:

答案 0 :(得分:1)

正如@Camilo Terevinto所指出的那样,你说heirarchy是错误的。尝试:

public abstract class IA
{
  public bool value;

  public virtual void ChangePropertyOfAIChild()
  {
    value = true;
  }
}

public class B : IA
{ }

public class C : IA
{ }

// in main
IA newBInstance = new B();
newBInstance.ChangePropertyOfAIChild();

IA newCInstance = new C();
newCInstance.ChangePropertyOfAIChild();
///

您的示例代码的基本抽象类试图更改其不知道的类中字段的值:

  

(b.value = true)

要使基类能够执行此操作,需要在基类内声明该字段。

答案 1 :(得分:1)

我相信你的继承权非常合适。

如果这是你的类实现:

public abstract class IA
{
}

public class B : IA
{
    public bool value;
}

public class C : IA
{
    public bool value;
}

然后,如果您像这样创建IA的实例:

IA newBInstance = new B();

然后编译器继续创建IA的实例。由于您的IA没有名为value的属性,因此您无法访问它。

您有两种选择,要么使用上一回复中CodexNZ建议的方法,要么只是将newInstance投射到B并直接设置value。像这样:

IA newBInstance = new B();
((B)newBInstance).value = true;

然而,这是违反直觉的,因为如果你能做到这一点,你也可以在第一时间创建B的实例。所以我推荐以前的方法。这更像是为了解释为什么你的逻辑无法正常工作。

请参阅教程like this了解详情。互联网上有更多的资源。