运行 派生 类 构造函数之后的东西

Run something after derived classes constructor

我有一个设计问题。假设我有一个基础 class,还有许多派生的 classes.

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;
    }
}

您可能会推断,我想记录派生的 classes 及其所有属性集。但是上面的例子无法记录派生的classes的特殊属性,因为它们在调用Record方法时没有设置。

克服这个问题的一种方法是制作 Record 方法 protected 并将其作为派生的 classes 构造函数的最后一行调用。但这违反了我的基本原则(每个派生的 class 都应该在初始化后立即记录)。我想通过设计使这个成为强制性的。

有什么办法可以解决这个问题?

再看看你要做什么。

请记住,在 派生的 class 的构造函数之前 调用了基础构造函数。

MyBase()
{
    Record();
}

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

此时 this 的值是多少?

实例还没有构造,派生的class的构造函数还没有被调用,所以没有对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;
     }
}