0

我目前有以下代码模式,其中我在通用类 MyClass 的构造函数中初始化 MyThing 类型的特定对象。然而,在某些特定的派生类示例(例如 MySpecialClass)中,我想使用 MyThing 的派生版本,我称之为 MySpecialThing。

public class MyClass
{
    public MyClass()
    {
        this.MyThing = new MyThing();
    }

    public MyThing MyThing { get; set; }
}

public class MySpecialClass : MyClass
{
    public MySpecialClass()
    {
        this.MyThing = new MySpecialThing();
    }
}

我的问题是这是否是不好的做法,因为实际上 MyThing 属性被初始化了两次,一次在基类中,一次在派生类中。显然,我可以将布尔值传递给基类构造函数或告诉它不要打扰初始化 MyThing 的东西,但这可能有点矫枉过正......

4

3 回答 3

5

这取决于创建 MyThing 的开销。

但是,有一个解决方案:

您可以添加一个接受 MyThing 类型参数的受保护基类构造函数,并在那里对其进行初始化。

public class MyClass
{
    private readonly MyThing myThing;

    public MyClass(): this(new MyThing())
    {
    }

    protected MyClass(MyThing thing)
    {
        Contract.Requires(thing != null);
        myThing = thing;
    }

    public MyThing MyThing { get { return myThing; } }
}

public class MySpecialClass : MyClass
{
    public MySpecialClass(): base(new MySpecialThing())
    {
    }
}

我认为这是比向公共基类构造函数添加布尔值更好的方法。

即使构建 MyThing 的开销很小,我也认为这样做是值得的,因为它更清楚地表达了设计。

我还稍微更改了设计以创建myThing一个只读字段,以表达它应该只在构建时设置的意图。(如果不是这种情况,并且您希望稍后可以设置它,则必须恢复为公共属性设置器。)

于 2013-04-09T09:59:27.713 回答
1

您是否关心性能或可维护性?

MyThing性能问题只有在构造函数很昂贵,或者您必须在紧密循环中创建大量对象时才有意义。

我会更担心可维护性,因为您有多个初始化对象状态的地方。您可以将它从派生类传递给受保护的基类构造函数,并具有默认使用MyThing的默认构造函数

于 2013-04-09T10:01:17.637 回答
0

使用受保护:

class BaseClass
{
    protected SomeType MyThing;
}
于 2013-04-09T09:58:41.413 回答