摘要 class 只读成员

abstract class with readonly member

我有一个这样的 class 结构,其中抽象 class A 在两个变量中包含接口 IB 和具体 class C。哪些 classes 被分配给该接口变量取决于继承抽象 class 的实际子 class A1、A2,并且需要 class C 在父 class 构造函数。 所以我首先想到的是:

abstract class A
{
    protected readonly IB _b;
    protected readonly C _c;

    protected A()
    {
        _c = new C();
    }
}

class B1 : IB
{
   public B1(C c) {}
}

class B2 : IB
{
   public B2(C c) {}
}

class A1 : A
{
    public A1() : base()
    {
        _b = new B1(_c);
    }
}

class A2 : A
{
    public A2() : base()
    {
        _b = new B2(_c);
    }
}

赋值_b = new B1(_c);不起作用,因为它受到保护。 我也不能将 class Bx 向下传递给基本构造函数,因为我需要在实例化 Bx 之前执行它。我还能如何实现我想要的结果?

一个readonly字段只能在同一个class中实例化,不能在子class中实例化。因此,A 的构造函数需要设置 _b.

但是,您可以将如何设置 _b 从子class 到抽象基础 class 的 知识 传递给一个 lambda 表达式:

A 的构造函数:

protected A(Func<C, IB> bFactory)
{
    _c = new C();
    _b = bFactory(_c);
}

A1 的构造函数:

public A1() : base(c => new B1(c)) { }

_b = ... 不起作用,因为只读字段只能在声明它的 class 的构造函数中初始化,而不能在子 class 中初始化。这不是因为 _b 受到保护。 documentation 表示:

In a field declaration, readonly indicates that assignment to the field can only occur as part of the declaration or in a constructor in the same class.

解决这个问题的一种方法是让 superclass 接受一个 Func<C, B1>,并在那里初始化 _b

protected A(Func<C, IB> bCreator)
{
    _c = new C();
    _b = bCreator(_c);
}

然后:

class A1 : A
{
    public A1() : base(c => new B1(c))
    {
        
    }
}

class A2 : A
{
    public A2() : base(c => new B2(c))
    {
        
    }
}