2017-08-15 61 views
-5

这就是:调用子实例从抽象父类中实现的功能在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(); 

///// 

什么是从抽象基类calliing在孩子的班级已经implememnted功能和改变有道它的价值? 谢谢!

+1

如果B是A的孩子,A怎么会知道(或者甚至在意)B存在?你的等级倒退 –

+0

我在这里错过了什么吗?这段代码甚至没有编译。你将如何访问一个甚至不存在的东西的属性? – Sach

回答

1

正如@Camilo Terevinto指出的那样,你的病态是错误的。尝试:

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 =真)

对于基类能够做到这一点,该字段需要在基类内声明。

+0

你是对的。谢谢! –

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建议的方法在前面的回复,或者干脆投你newInstanceB和直接设置value。就像这样:

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

然而,这是反直觉的,因为如果你能做到,你不妨首先创建的B一个实例。所以我推荐以前的方法。这是更多的解释为什么你的逻辑不起作用。

要了解更多信息,请参阅教程like this。互联网上有更多的资源。