для следующего кода:
delegate void deffault ();
public interface IBoom {
event deffault OnBoom;
}
public class BoomObject : IBoom {
public event deffault OnBoom;
public virtual void Start () {
}
}
public class Grenade : BoomObject {
public override void Start () {
if (OnBoom != null)
OnBoom ();
}
}
Я пытаюсь вызвать событие в базовом классе, выбрасывая подкласс, я не знаю, почему он вызывает исключение, и является ли это хорошей практикой или нет.
исключение, которое я получаю:
Событие BoomObject.OnBoom' can only appear on the left hand side of += or -= when used outside of the type
BoomObject '
это ошибка компилятора, моя проблема.
Это не исключение, это ошибка компилятора.
Проблема в том, что события, реализованные public event DelegateType Event;
, могут быть вызваны только в классе, который определяет событие, а не в любом производном классе.
Если вы хотите сделать это событие доступным для производных классов, реализуйте защищенный метод RaiseEvent()
в своем классе case:
public class BoomObject : IBoom {
public event deffault OnBoom;
protected void RaiseBoom() {
if (OnBoom != null)
OnBoom ();
}
public virtual void Start () {
}
}
public class Grenade : BoomObject {
public override void Start () {
RaiseBoom();
}
}
Вы получаете не исключение, а синтаксическую ошибку компилятора. Посмотрим, что там написано
The event BoomObject.OnBoom' can only appear on the left hand side of += or -= when used outside of the typeBoomObject
Хорошо, он говорит вам, что по какой-то причине вы можете использовать только -=
или +=
. Причина в том, что вы пытаетесь выполнить что-то за пределами класса, в котором было объявлено событие. Это сделано специально. События могут быть вызваны только в объявляющем классе.
Итак, чтобы поднять событие, вам нужно, например, создать метод в базовом классе и вызвать его в производном классе.
Конечно, это исключение? Это больше похоже на ошибку компилятора.