Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Środa, 18 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



Aby polepszyć jakość napisanego wcześniej kodu należy zmienić nieco interfejs klas zawartych w projekcie. Jeśli zastanowić się jaki jest największy problem występujący przy poprzednim rozwiązaniu to jest nim kwestia nazewnictwa konstruktora kopiującego (czyli nazwa zgodna z nazwą klasy). W przypadku składowej regulator_ nie znaliśmy prawdziwego typu przechowywanego w niej składnika: mógł to być zarówno wskaźnik RegulatorPID jak i RegulatorGPC (a także dowolny, inny regulatora nieznany w momencie tworzenia klasy Petla) – stąd konieczność instrukcji warunkowych i rzutowań dynamic_cast<T>.

Implementacja z wykorzystaniem wzorca Prototyp metodą klonowania opiera się na tym spostrzeżeniu – dla każdego obiektu definiuje się operację klonuj() tworzącą kopię ów obiektu i zwracającą wskaźnik do ów kopii. Dzięki polimorfizmowi zostanie wywołana ta implementacja metody klonuj() która pasuje do bieżącego typu konkretnego przechowywanego elementu.

Deklaracje klas wyglądają więc teraz następująco:

class Obiekt {
public:
	virtual double symuluj (double wej) = 0;
	virtual Obiekt * klonuj () const = 0;
};

class ARX : public Obiekt {
public:
	ARX (unsigned int k, const std::string & A, const std::string & B);
	virtual double symuluj (double wej);
	virtual ARX * klonuj () const;
private:
	// (...)
};

class RegulatorPID : public Obiekt {
public:
	RegulatorPID (double k, double Ti, double Td);
	virtual double symuluj (double wej);
	virtual RegulatorPID * klonuj () const;
private:
	// (...)
};

class RegulatorGPC : public Obiekt {
public:
	RegulatorGPC (unsigned int H, unsigned int L, double alfa, double ro, unsigned int stA, unsigned int stB);
	virtual double symuluj (double wej);
	virtual RegulatorGPC * klonuj () const;
private:
	// (...)
};

Cechą charakterystyczną zbioru powyższych deklaracji jest to, że wirtualna metoda klonuj() zwraca różne typy wskaźników – fakt ten zostanie omówiony w podsekcji "Kowariancja typów zwracanych".

Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11