美好的一天,我对经验丰富的C#程序员提出了一个相当简单的问题。基本上,我想有一个抽象的基类,它包含一个依赖于子类值的函数。我尝试过类似下面的代码,但是当SomeFunction()尝试使用它时,编译器会抱怨SomeVariable为null。
基类:
public abstract class BaseClass
{
protected virtual SomeType SomeVariable;
public BaseClass()
{
this.SomeFunction();
}
protected void SomeFunction()
{
//DO SOMETHING WITH SomeVariable
}
}
儿童班:
public class ChildClass:BaseClass
{
protected override SomeType SomeVariable=SomeValue;
}
现在我希望我这样做:
ChildClass CC=new ChildClass();
应该创建一个新的ChildClass实例,CC将使用SomeValue运行其继承的SomeFunction。然而,这不是发生的事情。编译器抱怨在BaseClass中SomeVariable为null。我想在C#中做什么甚至可能?我使用过其他托管语言,可以让我做这些事情,所以我确定我只是在这里犯了一个简单的错误。
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
你得到的几乎是正确的,但你需要使用属性而不是变量:
public abstract class BaseClass {
protected SomeType SomeProperty {get; set}
public BaseClass() {
// You cannot call this.SomeFunction() here: the property is not initialized yet
}
protected void SomeFunction() {
//DO SOMETHING WITH SomeProperty
}
}
public class ChildClass:BaseClass {
public ChildClass() {
SomeProperty=SomeValue;
}
}
您不能在构造函数中使用FomeFunction,因为SomeProperty尚未由派生类初始化。但是在构造函数之外它很好。通常,访问构造函数中的虚拟成员应被视为可疑。
如果必须将派生类中的值传递给基类构造函数,最好通过受保护构造函数的参数显式执行。