2016-09-27 57 views
0

我有一个设计问题。可以说我有一个基类和许多派生类。在派生类构造函数后运行一些东西

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并将其称为派生类构造函数的最后一行。但这违反了我的基本原则(每个派生类都应该在初始化后立即记录下来)。我想通过设计来制作这款腕表。

任何方式来处理?

+0

不可能的。唯一的方法就是通过Factory来做到这一点。对我来说,录音功能不合适,看起来你的班级做得比应该多。 – RvdK

+1

如果您将Record作为接口/抽象并在每个Derive类中实现,该怎么办? (你如何使用记录中的特殊道具?) –

回答

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

我知道'this'不存在,因为我需要它。正在寻找解决方法,虽然你基本上提供了它。谢谢。 –

相关问题