Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Klasy mieszane

W bardziej rozbudowanych systemach może dojść do sytuacji, w której rozpoczęcie powiadomienia z jednej klasy może rozpocząć szereg powiadomień przez klasy pośrednie do klas kolejnych. Z punktu widzenia implementacyjnego zachodzi w takim wypadku konieczność budowania klas, które są zarówno Obserwatorami jak i Obserwowanymi.

W języku C++ powyższą cechę można z łatwością uzyskać za pomocą wielodziedziczenia. W innych językach (nie wspierających tego mechanizmu) podobne rozwiązanie można uzyskać na dwa sposoby. Pierwszy z nich może polegać na tym, że klasa bazowa jest klasą ogólną definiującą interfejs (oraz w miarę możliwości implementację) zarówno dla Obserwatorów jak i Obserwowanych. Drugim rozwiązaniem jest użycie interfejsów (dziedziczenie po klasach, których wszystkie metody są czystowirtualne) – wówczas dziedziczenie klasy będzie zazwyczaj dotyczyć klasy Obserwowany, a implementacja interfejsu klasy Obserwator.

Przykład implementacji będzie modyfikacją przykładu poprzedniego. Tym razem zostanie dodana klasa AlarmPowiadamiajacy. Zostanie uczyniona klasą mieszaną (zarówno Obserwatorem jak i Obserwowanym). Jeśli wartość wyjściowa procesu przekroczy (co do wartości bezwzględnej) wartość graniczną ustawioną w klasie AlarmPowiadamiajacy dojdzie do powiadomienia klasy Logger. Tym razem więc obiekt klasy Logger nie będzie zapisywał wszystkich danych procesu, ale tylko te, które wyzwoliły uruchomienie alarmu.

Deklaracja klasy AlarmPowiadamiajacy:

class AlarmPowiadamiajacy : public Alarm, public Obserwowany {
public:
	AlarmPowiadamiajacy (double wartGraniczna);
	virtual void aktualizuj (double wartosc);
};

Należy zauważyć, ze klasa AlarmPowiadamiajacy nie dziedziczy klasy Obserwator bezpośrednio, ale dziedzicząc klasę Alarm pośrednio staje się klasą pochodną klasy Obserwator.

Implementacja metod:

AlarmPowiadamiajacy::AlarmPowiadamiajacy (double wartGraniczna) 
	: Alarm(wartGraniczna)
{
}

void AlarmPowiadamiajacy::aktualizuj (double wartosc) {
	if (sprawdz(wartosc))
		powiadom(wartosc);
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11