Mam klasę bazową, która zawiera następujące zdarzenia:
public event EventHandler Loading;
public event EventHandler Finished;
W klasie, która dziedziczy z tej klasy bazowej, próbuję podnieść zdarzenie:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Otrzymuję następujący błąd:
Zdarzenie „BaseClass.Loading” może pojawić się tylko po lewej stronie + = lub - = (BaseClass ')
Zakładam, że nie mogę uzyskać dostępu do tych wydarzeń tak samo, jak inni odziedziczeni członkowie?
c#
events
inheritance
jwarzech
źródło
źródło
Odpowiedzi:
Co musisz zrobić, to:
W swojej klasie bazowej (w której zadeklarowałeś zdarzenia) utwórz chronione metody, których można użyć do zgłaszania zdarzeń:
(Zwróć uwagę, że prawdopodobnie powinieneś zmienić te metody, aby sprawdzić, czy musisz wywołać eventhandler, czy nie).
Następnie w klasach dziedziczących z tej klasy bazowej można po prostu wywołać metody OnFinished lub OnLoading, aby zgłosić zdarzenia:
źródło
Dostęp do zdarzenia można uzyskać tylko w klasie deklarującej, ponieważ .NET tworzy prywatne zmienne instancji za kulisami, które faktycznie przechowują delegata. Robiąc to..
faktycznie to robi;
i robiąc to ...
czy właściwie to ...
Więc możesz (oczywiście) uzyskać dostęp do zmiennej instancji delegata prywatnego tylko z poziomu klasy deklarującej.
Konwencją jest zapewnienie czegoś takiego w klasie deklarującej.
Następnie możesz
OnMyPropertyChanged(EventArgs.Empty)
wywołać zdarzenie z dowolnego miejsca w tej klasie lub poniżej hierarchii dziedziczenia.źródło
Dokładnie. Zwykle zapewnia się chronioną funkcję
OnXyz
lubRaiseXyz
dla każdego zdarzenia w klasie bazowej, aby umożliwić podnoszenie z klas dziedziczonych. Na przykład:Wywołane w odziedziczonej klasie:
źródło
Możesz spróbować w ten sposób, to działa dla mnie:
źródło
nie po to, żeby wskrzeszać stary wątek, ale na wypadek, gdyby ktoś patrzył, to co zrobiłem
Umożliwia to dziedziczenie zdarzenia w klasie pochodnej, dzięki czemu można je wywołać bez konieczności zawijania metody, zachowując składnię + =. Myślę, że nadal możesz to zrobić za pomocą metod owijania, jeśli tak
źródło