-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinterface.cpp
82 lines (67 loc) · 2.67 KB
/
interface.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Megjegyzes: ez a peldakod szamos ok miatt nincs lefordulo allapotban (hianyoznak dolgok belole)
// Ha valaki szeretne azza hozni, akkor az jo gyakorlo feladat lehet...
// Interfesz (interface)
class IContainer {
public:
// Tisztan virtualas (absztrakt) metodusok (definicio nelkuliek)
virtual void addElem(int elem) = 0;
virtual int getElem(int index) = 0;
virtual int getsize() = 0;
virtual void clear() = 0;
//...
virtual ~IContainer() {} // kell, hogy a leszarmazott oszalyok sajat dtor-jait
// lehessen dinamikus kotesen keresztul hivni
};
// ^ absztakt osztaly, mert van tisztan virtual metousa -> nem lehet kozvetlen
// peldanyositani, de oroklodni persze lehet belole...
// Megvalositas (implementation) #1
class VectorContainer : public IContainer {
public:
// Implementalja az absztrakt szulo metodusait (overriding)
void addElem(int elem) { /*...*/ }
int getElem(int index) { /*...*/ }
int getsize() { /*...*/ }
void clear() { /*...*/ }
private:
int * _internal_array; // kell a belso adatszerkezethez
};
// Megvalositas (implementation) #2
class LinkedListContainer : public IContainer {
public:
// hasonloan megvalosit mindent...
void addElem(int elem) { /*...*/ }
int getElem(int index) { /*...*/ }
int getsize() { /*...*/ }
void clear() { /*...*/ }
private:
Node * _head; // kell a belso adatszerkezethez
};
int main()
{
IContainer * container = nullptr;
// Futasi idoben (mas neven: dinamikus idoben) dol majd el az altipus
std::cout << "What to create? (v = VectorContainer, l = LinkedListContainer)\n";
char answer;
std::cin >> answer;
if (answer == 'v')
container = new VectorContainer; // statikus tipus: IContainer, dinamikus tipus: VectorContainer
else if (answer == 'l')
container = new LinkedListContainer; // statikus tipus: IContainer, dinamikus tipus: LinkedListContainer
else
exit(1); // hiba
// Hasznalat
container->addElem(42);
container->clear();
//...
// Mivel az interface-en keresztul hasznaljuk, ezert kesobb barmikor lecserelhetem, hogy
// masik implementaciot hasznaljon, hiszen csak 1 helyen kell atirnom a kodot es
// le fog fordulni, mukodni fog (vagy akar a fentebb lathato modon ez futasi idoben
// is eldolhet/valtozhat...)
// Lasd: dependency injection
// Megjegyzes: az interfasze-t nem erdekli, hogy az o megvalositasai alatt milyen
// adatszerkezetek, milyen algoritmusok vannak, hogy hogyan van megvalositva egy-egy funkcio
// A felhasznaloja elol igy szinten el vannak rejtve az implementacios reszletek,
// eleg az interface-t megnezni a hasznalathoz -> adatabsztrakcio elve
// ^ Tulajdonkeppen ez a fo felhasznalasa a futasi ideju polimorfizmusnak
delete container; // ez ne maradjon le ;)
}