У меня есть привычка нарушать правила, если он делает мой код более кратким или мой API более удобен в использовании, и если я могу вдумчиво уйти с этим в конкретных обстоятельствах. Я хотел бы знать, могу ли я уйти со следующим таким нарушением.Отключить экземпляр перед возвратом конструктора
Следующая иллюстрация включает в себя один Child
и один класс Parent
. Фактически, я описываю общую ситуацию во всем приложении. Мое решение по этой проблеме затронет многочисленные классы, поэтому я задаю этот вопрос.
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
имущества, что я передаю от экземпляра к Parent
класса. Также обратите внимание, что я вызываю этот сеттер из публичного конструктора.
По состоянию на earlier question I asked, он пришел к выводу, что передача экземпляра, который не полностью инициализирован, является анти-шаблоном. Можно утверждать, что это то, что происходит здесь. Но я бы сказал, что это не так, поскольку базовое состояние инициализируется в беспараметричном конструкторе, который вызывается до того, как он принимает параметр Parent
.
Я думал о проблемном сценарии, возникающем, если конструктор подкласса Child
вызывает базовый конструктор с параметром Parent
. Если производный конструктор инициализирует собственное базовое состояние, он не будет готов к успеху для стороны. Но я полагаю, что я могу решить эту проблему с помощью ключевого слова sealed
, если он соответствует семантике класса, как это происходит в моих случаях Child
.
Как я могу пойти с нарушением описанного анти-шаблона в этих конкретных обстоятельствах? Или есть какое-то соображение, которое я пропустил?
Почему вы добавляете ребенка к родителю об установлении родителя в собственность? Кажется, что не существует соответствующего кода для удаления детей из родителей, с которыми они больше не связаны. Я мог бы склонить это к более определенному методу, а не к настройщику свойств, но кроме этого я не вижу никаких пропущенных соображений. –
Невозможно создать метод Add для класса Parent, который добавляет Child к себе? –
@AdamHouldsworth У меня есть [API, который обрабатывает все это] (http://www.qnomad.com/wpf/corehelpers/) (см. «Двунаправленные ассоциации»). – HappyNomad