如果我的代码更简洁,或者我的API使用起来更方便,并且在特定情况下能够谨慎地做到这一点,我就有违反规则的习惯。我想知道我是否可以逃避以下这种侵权行为。在构造函数返回前关闭实例
以下插图包括一个单独的Child
和单个Parent
类。事实上,我正在描述我的应用程序中的一种常见情况。我对这个问题的决定会影响很多课程,这就是为什么我问这个问题。在Parent
属性的setter
public sealed class Child : INotifyPropertyChanged
{
private Child()
{
//initialize basic state
}
public Child(Parent parent)
: this() //invoke parameterless contructor to initialize basic state
{
this.Parent = parent; //the last thing before the public ctor exits
}
public Parent Parent
{
get { return parent; }
set
{
if (value != parent) {
parent = value;
// initialize state that depends on the presence of a Parent instance
parent.Children.Add(this); //hand off to parent class
OnPropertyChanged("Parent");
}
}
}
// INotifyPropertyChanged impl...
}
请注意,我实例移交给了Parent
类。另外请注意,我正在从公共构造函数调用该setter。
在earlier question I asked上,发现将未完全初始化的实例移交是一种反模式。有人可能会认为这就是发生了什么。但我会说,情况并非如此,因为基本状态是在接受参数Parent
之前调用的无参数构造函数中初始化的。
我想如果Child
子类的构造函数使用Parent
参数调用基构造函数,则会出现问题场景。如果派生的构造函数初始化它自己的基本状态,那么它将不能及时准备好切换。但我想我可以用sealed
关键字解决这个问题,如果它适合类的语义,就像我在Child
类中的情况一样。
所以,我很好去打破在这些特定情况下引用的反模式?还是有一些我错过的考虑?
为什么你的孩子添加到父在属性设置父?似乎没有相应的代码可以将孩子从他们不再关联的父母中移除。我可能会倾向于将其转变为更明确的方法,而不是属性设置者,但除此之外,我不能看到任何遗漏的考虑因素。 –
是不是可以创建一个添加方法到父类添加一个孩子到自己? –
@AdamHouldsworth我实际上有[一个处理所有的API](http://www.qnomad.com/wpf/corehelpers/)(请参阅“双向关联”)。 – HappyNomad