在派生类构造函数

时间:2016-09-27 13:50:40

标签: c# oop object-oriented-analysis

我有一个设计问题。假设我有一个基类和许多派生类。

class MyBase
{ 
    MyBase()
    {
        Record();
    }

    void Record()
    {
        /// this line is able to handle every object
        Recorder.Process(this);
    }
}

class DerivedA : MyBase
{ 
    public int SpecialPropertyOfA { get; set; }
    DerivedA(int specialPropertyOfA)
    {
        SpecialPropertyOfA = specialPropertyOfA;
    }
}

class DerivedB : MyBase
{ 
    public string SpecialPropertyOfB { get; set; }
    DerivedA(string specialPropertyOfB)
    {
        SpecialPropertyOfB = specialPropertyOfB;
    }
}

正如您可能推断的那样,我想记录派生类及其所有属性集。但是上面的示例不能记录派生类的特殊属性,因为在调用Record方法时它们没有设置。

解决此问题的一种方法是使Record方法protected并将其称为派生类构造函数的最后一行。但这违反了我的基本原则(每个派生类应该在初始化后立即记录)。我想通过设计制作这个mandotory。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

再看一下你想要做的事情。

请记住,基类构造函数在派生类的构造函数之前被称为

MyBase()
{
    Record();
}

void Record()
{
    Recorder.Process(this); // <-- What is "this" ?
}

此时this的价值是多少?

实例尚未构建,派生类的构造函数没有被调用,所以没有this的引用,因此,你不能在这里使用它。

完全构建实例后,您必须在之后调用此方法

解决此问题的方法是使用工厂方法:

public static class MyBaseFactory
{
     public static MyBase CreateDerivedA()
     {
         int specialPropertyOfA = // ...
         MyBase instance = new DerivedA(specialPropertyOfA);
         Recorder.Process(instance);
         return instance;
     }

     public static MyBase CreateDerivedB()
     {
         string specialPropertyOfB = // ...
         MyBase instance = new DerivedB(specialPropertyOfA);
         Recorder.Process(instance);
         return instance;
     }
}