Обновление
Хорошо, прежде чем мы пойдем дальше, мы определенно должны прояснить определенный момент.
Похоже, вы хотите, чтобы это произошло:
class TypeWithEvents
{
public event PropertyChangedEventHandler PropertyChanged;
// You want the set method to automatically
// raise the PropertyChanged event via some
// special code in the EventRaisingType class?
public EventRaisingType Property { get; set; }
}
Вы действительно хотите иметь возможность писать свой код именно так?Это действительно полностью невозможно - по крайней мере, в .NET (по крайней мере, до тех пор, пока команда C # не придумает какой-нибудь необычный новый синтаксический сахар специально для интерфейса INotifyPropertyChanged
, который, я считаю,фактически обсуждался) - поскольку объект не имеет понятия «переменные, которые были назначены мне».На самом деле нет никакого способа представить переменную , используя объект вообще (я полагаю, что выражения LINQ - это способ, но это совершенно другой предмет).Это работает только наоборот.Допустим, у вас есть:
Person x = new Person("Bob");
x = new Person("Sam");
Знает ли «Боб», что x
только что назначен на «Сэма»? Абсолютно нет : переменная x
просто указала на «Боб», она никогда не была «Боб»;поэтому «Боб» не знает и не заботится о том, что происходит с x
.
. Таким образом, объект не может надеяться на выполнение какого-либо действия, основанного на изменении переменной, указывающей на него, на точкуна что-то другое.Это было бы так, как если бы вы написали мое имя и адрес на конверте, а затем стерли его и написали имя другого человека, и я каким-то волшебным образом знал, что @ macias просто изменил адрес на конверте с моего на чужой!
Конечно, вы можете * изменить свойство так, чтобы его методы get
и set
модифицировали другое свойство частного member и свяжите ваши события с событием, предоставленным этим участником (это, по сути, siride предложил ).В этом сценарии было бы разумно желать ту функциональность, о которой вы спрашиваете.Это сценарий, который я имею в виду в своем первоначальном ответе:
Оригинальный ответ
Я бы не сказал, что то, о чем вы просите, просто плосконе так, как полагают некоторые другие.Очевидно, что может быть полезной для разрешения частному члену класса вызывать одно из событий этого класса, например, в описанном вами сценарии.И хотя идея Саураба хорошая, ясно, что она не всегда может быть применена, так как в C # отсутствует множественное наследование *.
, что подводит меня к моей точке зрения.Почему не C # допускает множественное наследование?Я знаю, что это может показаться не по теме, но ответы на этот и тот же вопрос одинаковы.Дело не в том, что это незаконно, потому что это «никогда» не имеет смысла;это незаконно, потому что есть просто больше минусов, чем плюсов. Многократное наследование очень трудно понять правильно.Точно так же поведение, которое вы описываете, было бы очень легко злоупотреблять.
То есть, да, общий случай, описанный Рексом , дает довольно хороший аргумент против объектов, поднимающих другие объекты.' События.Сценарий , который вы описали , с другой стороны - постоянное повторение стандартного кода - похоже, что-то вроде в пользу такого поведения.Вопрос в том, какому вопросу следует придать больший вес?
Допустим, разработчики .NET решили разрешить это и просто надеются, что разработчики не злоупотребят этим.Почти наверняка будет много больше неработающего кода там, где разработчик класса X
не ожидал, что событие E
будет вызвано классом Y
, в другой сборке.Но это так, и состояние объекта X
становится недействительным, и тонкие ошибки появляются везде.
А как насчет противоположного сценария?Что если они запретят это?Теперь, конечно, мы просто рассматриваем реальность, потому что это является случаем.Но какой здесь огромный недостаток?Вы должны скопировать и вставить один и тот же код в кучу мест.Да, это раздражает;но также есть способы смягчить это (например, идея базового класса Саураба).И возбуждение событий строго определяется типом объявления, всегда , что дает нам гораздо большую уверенность в поведении наших программ.
Итак:
EVENT POLICY | PROS | CONS
------------------------------+---------------------+-------------------------
Allowing any object to raise | Less typing in | Far less control over
another object's event | certain cases | class behavior, abun-
| | dance of unexpected
| | scenarios, proliferation
| | of subtle bugs
| |
------------------------------------------------------------------------------
Restricting events to be only | Much better control | More typing required
raised by the declaring type | of class behavior, | in some cases
| no unexpected |
| scenarios, signifi- |
| cant decrease in |
| bug count |
Представьте, что вы несете ответственность за решение о том, какую политику событий реализовать для .NET.Какой из них вы бы выбрали?
* Я говорю «C #», а не «.NET», потому что на самом деле я не уверен, является ли запрет на множественное наследование CLR или просто C #,Кто-нибудь знает?