-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInterfaceSegregationPrinciple.cpp
More file actions
133 lines (110 loc) · 5.5 KB
/
InterfaceSegregationPrinciple.cpp
File metadata and controls
133 lines (110 loc) · 5.5 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <string>
using namespace std;
// Базовый класс для всех животных
class Animal {
virtual bool isAlive() = 0;
virtual int getEnergy() = 0;
virtual string getName() = 0;
};
// Интерфейс для животных, которые могут летать
__interface IFlyable {
void fly();
};
// Интерфейс для животных, которые могут плавать
__interface ISwimmable {
void swim();
};
// Интерфейс для животных, которые могут издавать звуки
__interface ISpeakable {
void speak();
};
// Класс кошки, реализующий интерфейс ISpeakable
class Cat : /* public Animal, */ public ISpeakable {
public:
void speak() {
cout << "Мяу!\n";
}
};
// Класс собаки, реализующий интерфейсы ISwimmable и ISpeakable
class Dog : /* public Animal, */ public ISwimmable, public ISpeakable {
public:
void swim() {
cout << "Плыву по-собачьи!\n";
}
void speak() {
cout << "Гав-гав!\n";
}
};
// Класс птицы, реализующий интерфейсы IFlyable и ISpeakable
class Bird : /* public Animal, */ public IFlyable, public ISpeakable {
public:
void fly() {
cout << "Я лечу!\n";
}
void speak() {
cout << "Чик-чирик!\n";
}
};
// Класс рыбы, реализующий интерфейс ISwimmable
class Fish : /* public Animal, */ public ISwimmable {
public:
void swim() {
cout << "Плыву в воде!\n";
}
};
int main() {
setlocale(0, "");
// Создание объектов и вызов их методов
Cat cat;
cat.speak();
Dog dog;
dog.swim();
dog.speak();
Bird bird;
bird.fly();
bird.speak();
Fish fish;
fish.swim();
}
/*
Задание: создать интерфейс для класса животных, который
реализует принцип Interface Segregation Principle.
Создайте интерфейс с именем Animal, который будет иметь методы,
относящиеся к животным. Например, интерфейс может содержать
методы isAlive(), getEnergy() и getName().
Создайте несколько классов, которые будут реализовывать этот
интерфейс. Каждый класс будет представлять различный вид
животного, например, класс Cat, Dog, Bird, Fish и т.д.
Разбейте интерфейс на более мелкие интерфейсы, чтобы
соответствовать принципу Interface Segregation Principle.
Например, вы можете создать интерфейсы IFlyable, ISwimmable,
ISpeakable, которые будут включены в основной интерфейс Animal.
Классы животных могут теперь реализовывать только те интерфейсы,
которые соответствуют их специфическим потребностям.
Обновите классы животных, чтобы они реализовывали только те
интерфейсы, которые им необходимы. Например, класс Cat будет
реализовывать только интерфейсы ISpeakable, а класс Fish будет
реализовывать только интерфейс ISwimmable.
Напишите тесты для проверки работоспособности кода.
Это задание демонстрирует, как использование принципа
Interface Segregation может помочь создавать более гибкий и
расширяемый код. Разбиение интерфейса на более мелкие
интерфейсы позволяет классам реализовывать только те методы,
которые им нужны, что повышает модульность и улучшает
переиспользование кода.
===========================================================
В данном коде реализован принцип Interface Segregation Principle
(ISP) - разделения интерфейсов. Вместо создания одного
интерфейса Animal, содержащего все возможные методы для животных,
были созданы более специализированные интерфейсы IFlyable,
ISwimmable и ISpeakable, которые описывают только те функции,
которые должны быть реализованы классами, способными летать,
плавать и издавать звуки соответственно.
Таким образом, классы-наследники реализуют только те методы,
которые им нужны, и не обязаны реализовывать ненужные методы,
что снижает связность между классами и делает код более гибким
и расширяемым.
*/
// BAD EXAMPLE: https://gist.github.com/sunmeat/bc829ddad45261695fcb9a1c189921cb
// GOOD EXAMPLE: https://gist.github.com/sunmeat/6eacb206150ced7ea786cbf7ba792c67