Abstract class 的 Subclass,总是调用 Abstract 构造函数
Subclass of an Abstract class, always call Abstract constructor
我有一个摘要class和一个childclass
abstract class abstractClass
{
public int x;
protected abstractClass(int x)
{
this.x = x;
}
}
class childClass : abstractClass
{
childClass(int x)
: base(x)
{
}
}
我有很多像这样的 child classes,其中所有这些 classes 总是通过调用 [=13= 来调用公共构造函数 abstractClass1(int x)
] 在他们的构造函数中。
当我想向构造函数添加一个新的 属性 时,例如另一个 int y
,我必须编辑所有这些 classes 并添加 y
作为每个 child 的构造函数加上抽象 class 构造函数的参数。
考虑到我事先知道每个 child class 都将使用抽象 class 构造函数并且不会添加任何其他内容,是否有另一种方法可以做到这一点?
很遗憾,我认为您无法通过任何其他方式做到这一点。你必须修改 abstract class 因为你必须添加新成员 y。您可以修改抽象 class 构造函数来初始化成员 y 或者您可以围绕 y 创建一个 属性 并让 children 在构造函数中初始化它。
在我看来,大多数已经存在的子classes 可以很容易地接受新属性 y 的默认值。在这种情况下,使用新的 属性 初始值设定项为基础 class 添加一个新构造函数,并让旧构造函数将新 属性 的值设置为公共默认值。现在只有需要新 属性 的非默认值的子 classes 需要调用扩展的 base-class 构造函数。
您的示例变为:
abstract class abstractClass
{
public int x { get; private set; }
public int y { get; private set; }
protected abstractClass(int x) : this(x, defaultY) {}
protected abstractClass(int x, int y)
{
this.x = x;
this.y = y;
}
}
class childClass : abstractClass
{
childClass(int x)
: base(x)
{
}
}
class childClass2 : abstractClass
{
childClass(int x, int y)
: base(x,y)
{
}
}
这是一个想法:制作一个 AbstractClassParameters
class:
class AbstractClassParameters {
public int x { get; private set; }
// add more parameters here
public AbstractClassParameters(int x) {
this.x = x;
// add more initializers here
}
}
现在您可以将 AbstractClassParameters
的实例传递给抽象 class 构造函数,每个子 class 都可以做同样的事情,只需传递它即可。
abstract class abstractClass
{
public int x;
protected abstractClass(AbstractClassParameters p)
{
this.x = p.x;
}
}
class childClass : abstractClass
{
childClass(AbstractClassParameters p) : base(p) { }
}
添加参数时,只需编辑AbstractClassParameters
class和abstractClass
,而不是每个子class。
我有一个摘要class和一个childclass
abstract class abstractClass
{
public int x;
protected abstractClass(int x)
{
this.x = x;
}
}
class childClass : abstractClass
{
childClass(int x)
: base(x)
{
}
}
我有很多像这样的 child classes,其中所有这些 classes 总是通过调用 [=13= 来调用公共构造函数 abstractClass1(int x)
] 在他们的构造函数中。
当我想向构造函数添加一个新的 属性 时,例如另一个 int y
,我必须编辑所有这些 classes 并添加 y
作为每个 child 的构造函数加上抽象 class 构造函数的参数。
考虑到我事先知道每个 child class 都将使用抽象 class 构造函数并且不会添加任何其他内容,是否有另一种方法可以做到这一点?
很遗憾,我认为您无法通过任何其他方式做到这一点。你必须修改 abstract class 因为你必须添加新成员 y。您可以修改抽象 class 构造函数来初始化成员 y 或者您可以围绕 y 创建一个 属性 并让 children 在构造函数中初始化它。
在我看来,大多数已经存在的子classes 可以很容易地接受新属性 y 的默认值。在这种情况下,使用新的 属性 初始值设定项为基础 class 添加一个新构造函数,并让旧构造函数将新 属性 的值设置为公共默认值。现在只有需要新 属性 的非默认值的子 classes 需要调用扩展的 base-class 构造函数。
您的示例变为:
abstract class abstractClass
{
public int x { get; private set; }
public int y { get; private set; }
protected abstractClass(int x) : this(x, defaultY) {}
protected abstractClass(int x, int y)
{
this.x = x;
this.y = y;
}
}
class childClass : abstractClass
{
childClass(int x)
: base(x)
{
}
}
class childClass2 : abstractClass
{
childClass(int x, int y)
: base(x,y)
{
}
}
这是一个想法:制作一个 AbstractClassParameters
class:
class AbstractClassParameters {
public int x { get; private set; }
// add more parameters here
public AbstractClassParameters(int x) {
this.x = x;
// add more initializers here
}
}
现在您可以将 AbstractClassParameters
的实例传递给抽象 class 构造函数,每个子 class 都可以做同样的事情,只需传递它即可。
abstract class abstractClass
{
public int x;
protected abstractClass(AbstractClassParameters p)
{
this.x = p.x;
}
}
class childClass : abstractClass
{
childClass(AbstractClassParameters p) : base(p) { }
}
添加参数时,只需编辑AbstractClassParameters
class和abstractClass
,而不是每个子class。