我知道在C#中继承构造函数是不可能的,但是可能有办法做我想做的事情.
我有一个由许多其他类继承的基类,并且它有一个Init方法,它使用1个参数进行初始化.所有其他继承类也需要这个初始化,但我需要为所有这些创建单独的构造函数,如下所示:
public Constructor(Parameter p) {
base.Init(p);
}
Run Code Online (Sandbox Code Playgroud)
这完全违反了DRY原则!如何在不创建数十个构造函数的情况下初始化所有必需的东西?
Rob*_*ine 84
您不需要创建大量的构造函数,所有构造函数都使用相同的代码; 您只创建一个,但派生类调用基础构造函数:
public class Base
{
public Base(Parameter p)
{
Init(p)
}
Init(Parameter p)
{
// common initialisation code
}
}
public class Derived : Base
{
public Derived(Parameter p) : base(p)
{
}
}
Run Code Online (Sandbox Code Playgroud)
AHM*_*AHM 11
将init函数更改为它是基类的构造函数,然后从继承的对象中调用它,如下所示:
public InheritedObject(Parameter p) : base(p)
{
}
Run Code Online (Sandbox Code Playgroud)
在构造函数本身的任何代码运行之前,将调用基础构造函数.
不重复base.Init调用的唯一方法是调用基础构造函数
class Base
{
public Base(Parameter p)
{
this.Init(p)
}
private void Init(Parameter p)
{
...
}
}
class Inherited : Base
{
public Inherited(Parameter p)
: base(p)
{
// other constructor logic, but Init is already called.
}
}
Run Code Online (Sandbox Code Playgroud)
您不能继承构造函数,但可以从派生子级的构造函数中调用它们。如果将基类默认构造函数设置为私有,它将强制您在每次创建派生类时选择基构造函数。
class A
{
protected A(int x)
{
}
}
class B : A
{
B(int x)
: base(x)
{
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50141 次 |
| 最近记录: |