EN: Usually, concrete classes override only a fraction of base class' operations. RU: Обычно конкретные классы переопределяют только часть операций базового класса.
| 108 | |
| 109 | |
| 110 | class ConcreteClass2(AbstractClass): |
| 111 | """ |
| 112 | EN: Usually, concrete classes override only a fraction of base class' |
| 113 | operations. |
| 114 | |
| 115 | RU: Обычно конкретные классы переопределяют только часть операций базового |
| 116 | класса. |
| 117 | """ |
| 118 | |
| 119 | def required_operations1(self) -> None: |
| 120 | print("ConcreteClass2 says: Implemented Operation1") |
| 121 | |
| 122 | def required_operations2(self) -> None: |
| 123 | print("ConcreteClass2 says: Implemented Operation2") |
| 124 | |
| 125 | def hook1(self) -> None: |
| 126 | print("ConcreteClass2 says: Overridden Hook1") |
| 127 | |
| 128 | |
| 129 | def client_code(abstract_class: AbstractClass) -> None: |