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



Zapamiętywanie fabryk w obiektach

W przedstawionych przykładach wybrana fabryka tworzyła obiekty pochodne klasy ObiektDyskretny, które poza metodą zwrocParametr() nie dodawały żadnej nowej funkcjonalności w stosunku do klasy bazowej. Klienci korzystający z zaimplementowanych do tej pory klas chcieli by mieć do dyspozycji co najmniej zestaw metod umożliwiających zmianę parametrów.

Jeśli obiekt dyskretny został utworzony przez określoną fabrykę, to wszelkie zmiany obiektu (nowe wyliczanie współczynników wielomianów) powinny być zgodne z metodą obraną podczas tworzenia obiektu. Reasumując jeśli, np. obiekt inercyjny 1-go rzędu został utworzony przez fabrykę odpowiadającą metodzie Tustina to po zmianie parametrów obiektu wyliczenie nowej postaci wielomianów również musi odbyć się za pomocą metody Tustina (a więc tej samej fabryki).

Prostym i zarazem wystarczającym rozwiązaniem jest po prostu przechowywanie wskaźnika do określonej fabryki jako składnika obiektu inicjalizowanego z poziomu konstruktora.

Zmiany w deklaracji klasy bazowej są następujące:

// deklaracja zapowiadająca
class FabrykaObiektow;

class ObiektDyskretny {
protected:
	ObiektDyskretny (const std::string & A, const std::string & B, double Tp, double k, const FabrykaObiektow * const fabryka);
public:
	(...)
	virtual void zmienParametr (const std::string & parametr, double wartosc);
protected:
	(...)
	const FabrykaObiektow * const fabryka_;

	friend class FabrykaObiektow;
};

Konstruktor został uzupełniony o dodatkowy argument wskaźnikowy, dodano również metodę zmienParametr() pozwalającą na zmianę właściwości obiektu i wykorzystanie odwołania do fabryki.

ObiektDyskretny::ObiektDyskretny (const std::string & A, const std::string & B, double Tp, double k, const FabrykaObiektow * const fabryka) 
	: s_A(A), s_B(B), s_Tp(Tp), s_k(k), fabryka_(fabryka)
{
}


void ObiektDyskretny::zmienParametr (const std::string & parametr, double wartosc) {
	if (parametr == "Tp") s_Tp = wartosc;
	else if (parametr == "k") s_k = wartosc;
	else
		throw std::exception(std::string("Podany parametr (" + parametr + ") nie jest znany").c_str());
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11