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



Iteratory polimorficzne

Przedstawione w poprzedniej sekcji modyfikacje procesu iteracji opierały się na właściwym parametryzowaniu konstruktorów iteratora, ale zawsze używana była ta sama klasa Iterator. Może się jednak zdarzyć, że pożądane przez klienta różnorodności działania iteratorów mogą być tak różne, że nie sposób ich określić za pomocą jednej, parametryzowanej klasy. W takiej sytuacji można pokusić się o wprowadzenie hierarchii iteratorów.

W kolejnym przykładzie zostanie wyprowadzony nowy iterator, który umożliwi sekwencyjne przechodzenie przez kontener, a dodatkowo w przypadku braku wartości określonej dla danej próbki będzie wyznaczał ją poprzez uśrednienie znanych wartości pośrednich. Dla ułatwienia przykład ogranicza się do iteratorów przechodzących pełny zakres kontenera.

Oba rodzaje iteratorów (IteratorZwykły działający jak implementacje przedstawione do tej pory w przykładach, oraz IteratorUsredniający – zgodnie z powyższym opisem) będą iteratorami wyprowadzonymi z klasy bazowej Iterator.

Zmiana interfejsu klasy ModelDanych ograniczy się do wprowadzenia nowego typu.

enum TypIteratora { ITERATORZWYKLY = 0, ITERATORUSREDNIONY = 1 };

Na jego podstawie (argument metody tworzącej) będzie tworzony nowy iterator.

iterator * pobierzIterator(TypIteratora typ) const;


ModelDanych::iterator * ModelDanych::pobierzIterator(TypIteratora typ) const {
	if (typ == ITERATORZWYKLY) 
		return new iteratorZwykly(s_impl);
	else 
		return new iteratorUsredniajacy(s_impl);
}

Abstrakcyjna klasa bazowa wyprowadza interfejs iteratorów i przechowuje dane o zasięgu chronionym z których będą mogły korzystać klasy pochodne:

class ModelDanych {
public:
	// (...)
	class iterator {
	protected:
		iterator (const std::map<int, double> & model);
	public:
		virtual ~iterator () {}
		virtual int x() const = 0;
		virtual double y() const = 0;
		virtual void nastepny () = 0;
		virtual bool czyKoniec () const = 0;
	protected:
		typedef std::map<int, double> TypModelu;
		const TypModelu &s_model;
		TypModelu::const_iterator s_iter;
		TypModelu::const_iterator s_iterKoniec;
	};

	// (...)
}
ModelDanych::iterator::iterator (const std::map<int, double> & model)
	: s_model(model)
{
	s_iter = s_model.begin();
	s_iterKoniec = s_model.end();
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11