我真的必须将所有构造函数从 and 复制Foo
到Bar
andBah
吗?然后,如果我在 中更改构造函数签名Foo
,我是否必须在Bar
和中更新它Bah
?
是的,如果您使用构造函数来创建实例。
有没有办法继承构造函数?
没有。
有没有办法鼓励代码重用?
好吧,我不会讨论继承构造函数是好事还是坏事,以及它是否会鼓励代码重用,因为我们没有它们,我们也不会得到它们。:-)
但是在 2014 年,使用当前的 C#,您可以通过使用泛型方法来获得非常类似于继承构造函数的东西。create
随身携带它可能是一个有用的工具,但你不会轻易伸手去拿它。我最近在面临需要将某些内容传递给用于数百个派生类的基类型的构造函数时(直到最近,基不需要任何参数,因此默认构造函数很好 - 派生类根本没有声明构造函数,而是获得了自动提供的构造函数)。
它看起来像这样:
// In Foo:
public T create<T>(int i) where: where T : Foo, new() {
T obj = new T();
// Do whatever you would do with `i` in `Foo(i)` here, for instance,
// if you save it as a data member; `obj.dataMember = i;`
return obj;
}
也就是说,您可以create
使用类型参数调用泛型函数,该类型参数是Foo
具有零参数构造函数的任何子类型。
然后,而不是做Bar b new Bar(42)
,你会这样做:
var b = Foo.create<Bar>(42);
// or
Bar b = Foo.create<Bar>(42);
// or
var b = Bar.create<Bar>(42); // But you still need the <Bar> bit
// or
Bar b = Bar.create<Bar>(42);
我已经展示了直接开启的create
方法Foo
,但当然它可以在某种工厂类中,如果它设置的信息可以由该工厂类设置。
只是为了清楚起见:名称create
并不重要,它可以是makeThingy
或您喜欢的任何其他内容。
完整示例
using System.IO;
using System;
class Program
{
static void Main()
{
Bar b1 = Foo.create<Bar>(42);
b1.ShowDataMember("b1");
Bar b2 = Bar.create<Bar>(43); // Just to show `Foo.create` vs. `Bar.create` doesn't matter
b2.ShowDataMember("b2");
}
class Foo
{
public int DataMember { get; private set; }
public static T create<T>(int i) where T: Foo, new()
{
T obj = new T();
obj.DataMember = i;
return obj;
}
}
class Bar : Foo
{
public void ShowDataMember(string prefix)
{
Console.WriteLine(prefix + ".DataMember = " + this.DataMember);
}
}
}