konto usunięte

Temat: Dziedziczenie

Witam,

Mam małą zagwozdkę, a mianowicie. Maska bazowa ma jakiś button na sobie i zdarzenie takiego buttona ma mniej więcej coś takiego zaimplementowane.

private void Button_Click(object sender, EventArgs e)
{
if(i==1) //i jest jakąś zmienna zaimplementowaną gdzieś wcześniej
return
else
.
.
.
}

Na innej masce która dziedziczy po bazowej i również ma przycisk(dziedziczący z bazowego) i zdarzenie podpiete:

private void Button_Click(object sender, EventArgs e)
{
messagebox.show("Ala ma kota");
}

I teraz pytania:
1. czy ZAWSZE zdarzenie z maski bazowej wykona się wcześniej niż zdarzenie na masce potomnej po kliknięciu tego przycisku na masce potomnej (czyli pójdzie ten if)? Czy może jednak jawnie trzeba odwołać się do maski bazowej i wykonać tą metodę?
2. Czy da się jakoś zrobić tak że jeżeli nie jest spełniony warunek w zdarzeniu na kliknięcie w bazowej i wychodzi tym returnem tak aby nie wykonywał w masce potomnej messagebox.show ? W Delphi mniej więcej wiem jak to można osiągnąć, czy w C# bez eventhandlerów, delegatów da się to jakoś objeść?

Z góry dziękuję
Michał M.

Michał M. Professional .NET
Developer

Temat: Dziedziczenie

A możesz nieco jaśniej? Maska to kontrolka czy klasa? Nie spotkałem, się z terminem maska, więc pytam. (Może to coś z Delphi?)

konto usunięte

Temat: Dziedziczenie

fakt ;-) maska=forma ;-)
Michał M.

Michał M. Professional .NET
Developer

Temat: Dziedziczenie

Generalnie Event może być wywołany tylko z klasy w której został zadeklarowany. Jeżeli chcesz go wywołać z klasy potomnej, to metoda go wywołująca w klasie bazowej, powinna być protected i wtedy można ja wywołać z klasy potomnej. Jeżeli ta metoda jest dodatkowo wirtualna (virtual) to wtedy możesz ja dowolnie przeciążyć. Generalnie, można zrobić tak, ze będzie wywołana metoda bazowa, lub nie. Co do drugiej części pytania, to bezpośrednio w takiej postaci się nie da, ale możesz nieco zrefaktorowac kod, tak aby za zwrócenie informacji czy warunek jest spełniony odpowiadała oddzielna metoda zwracająca true/false (powinna takze byc protected), wtedy można by było to także sprawdzać z klasy potomnej.

konto usunięte

Temat: Dziedziczenie

Ok, dzięki za pomoc
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: Dziedziczenie

Jeszcze jedno spostrzeżenie ... warto pamiętać że obsługę zdarzeń można zmieniać dynamicznie:
<code>
obiekt.delegatZdarzenia += new EventHandler(obslugaZdarzenia);
i analogicznie
obiekt.delegatZdarzenia -= new EventHandler(obslugaZdarzenia);
</code>

... zatem specyficzna obsługa zdarzeń kontrolek mogłaby być inicjalizowana w wymuszonej przez interfejs np. klasy bazowej.

konto usunięte

Temat: Dziedziczenie

Jeszcze jedna przydatna informacja.

Po tym jak oblsuzysz zdarzenie np.:
obiekt.delegatZdarzenia += new EventHandler(obslugaZdarzenia);

pamietaj o wykonaniu:
obiekt.delegatZdarzenia -= new EventHandler(obslugaZdarzenia);
gdzies przed skonczeniem pracy z obiektem.GGdybys tylko usunal ref. do obiektu bez usuwania oblusgi zdarzenia to pozostanie ono w pamieci.
Wojciech Gomoła

Wojciech Gomoła Now is my Time

Temat: Dziedziczenie

Każda Component posiada kolekcję podpiętych do niej Eventów (oczywiście głównie tych tworzonych przez MS) właściwość z nimi nazywa się Events i jest chroniona ale można się trochę pobawić. Osobiście w niej nie grzebałem ale czuje że niesie spore możliwości.

Następna dyskusja:

C++/CLI - dziedziczenie




Wyślij zaproszenie do