如果我的代碼更簡潔,或者我的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