使基础 class 方法使用新的子字段

Make base class method use new child field

我有一个 class 方法,该方法调用隐藏在继承它的 class 中的对象的方法(但新字段也是从 baseField 继承的),并且我需要调用此方法以在新字段上进行,但是当我调用 childClass.doSomething() 时,我收到一个异常,提示 baseField 为空。

我认为这是因为正在访问baseClass中的baseField,它还没有被实例化,但我不太确定

如何让 someMethod 在从 childClass 访问时使用 ExtendedBaseField

public abstract class baseClass{

    protected BaseField baseField;

    public void someMethod(){
        baseField.doSomething()
    }
}

还有一个 class 继承了它:

public class childClass : baseClass{
    protected new ExtendedBaseField baseField = new ExtendedBaseField();
}

new childClass().someMethod(); //null pointer exception

ExtendedBaseField继承BaseField

childclass是隐藏baseField:

protected new ExtendedBaseField baseField = new ExtendedBaseField();

这会创建一个newbaseField属性,所以childclass不能再看到基数class'baseField 属性。因此,它永远不会被设置。因此,它是 null.

不要隐藏基础 class' 字段。如果你想让基础 class 使用它,让 child class 使用它来:

public class childClass : baseClass {
    public childClass() {
        baseField = new ExtendedBaseField();
    }
}

您使用的是创建新字段的 new 关键字,而不是设置旧关键字。我反对保护字段,它们应该是属性。 .NET 中的所有属性、方法和 classes 也应该使用驼峰式大小写。括号也应该单独一行。

根据您的评论,您希望对新类型进行类型化访问,因此您应该使基础 class 通用。我也证明了这一点。

public abstract class BaseClass<T>
    where T: BaseField
{
    protected BaseClass(T baseField)
    {
         this.BaseField = baseField;
    }
    protected T BaseField{get; private set;};

   public void SomeMethod()
   {
    BaseField.DoSomething()
   }
}
public class ChildClass : BaseClass<ExtendedBaseField>
{
      public ChildClass() : base(new ExtendedBaseField())
      {

      }
}

其他人给出了正确的技术答案:您明确地隐藏了基地中的字段 class。

我会在这里谈谈不好的做法。

在C++中,有RAII的概念。资源分配是初始化。在 C# 中,我们通常不必像在 C++ 中那样考虑资源分配,但是 RAII 的模式仍然是一个很好的做法。

class 中声明的所有字段都应内联初始化

protected BaseField baseField = new BaseField();

...或在 class

的构造函数中
protected BaseField baseField;
public BaseClass<T>()
{
    this.baseField = new BaseField();
}

如果那不可能,则使用抽象 属性 而不是字段,这会强制子 class 实现并初始化它。

protected abstract BaseField BaseField { get; }