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



这里是:

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();
/////

将儿童类中已经实现的函数从基本抽象类中调用并更改其值的正确方法是什么? 谢谢!

正如@Camilo特雷文托指出的那样,你的继承制是错误的。 尝试:

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.值 = 真(

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

我相信你的遗产不太正确。

如果这是您的类实现:

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的实例。所以我推荐以前的方法。这更多地是为了解释为什么你的逻辑不起作用。

请参考这样的教程以了解更多信息。互联网上还有大量资源。

相关内容

  • 没有找到相关文章

最新更新