运行 派生 类 构造函数之后的东西
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;
}
}
我有一个设计问题。假设我有一个基础 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;
}
}