摘要 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))
{
}
}
我有一个这样的 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))
{
}
}