我有一个设计问题。假设我有一个基类和许多派生类。
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。
有办法解决这个问题吗?
答案 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;
}
}