TODO: отвалидировать – текст собран автоматически из материалов курса на Google Drive, проверьте формулировки и код.
Определение: Абстракция – фокусировка на существенных характеристиках объекта с игнорированием деталей.
-
Видимо: кнопки выбора кофе.
-
Скрыто: механизм помола, нагрев воды.
-
Абстракция: «Что делает?»
-
Инкапсуляция: «Как защищено?»
Пример
using System;
using System.Reflection;
public class CoffeeMachine
{
private bool _coffeeIsPrepared = false;
private bool _waterIsBoiled = false;
public bool MakeCoffee()
{
GrindCoffee();
BoilWater();
return _coffeeIsPrepared && _waterIsBoiled;
}
private void GrindCoffee()
{
_coffeeIsPrepared = true;
}
private void BoilWater()
{
_waterIsBoiled = true;
}
}
class Program
{
static void Main()
{
CoffeeMachine coffeeMaker = new CoffeeMachine();
Console.WriteLine(coffeeMaker.MakeCoffee()); // Выведет: True
}
}
#include <iostream>
class CoffeeMachine {
public:
// Наружу торчит только этот метод
bool MakeCoffee() {
GrindCoffee();
BoilWater();
return coffee_is_prepared_ && water_is_boiled_;
}
private:
bool coffee_is_prepared_ = false;
bool water_is_boiled_ = false;
void GrindCoffee() { coffee_is_prepared_ = true; }
void BoilWater() { water_is_boiled_ = true; }
};
int main() {
CoffeeMachine coffee_maker;
std::cout << std::boolalpha << coffee_maker.MakeCoffee() << std::endl; // true
return 0;
}
package main
import "fmt"
// Наружу торчит только MakeCoffee: методы с маленькой буквы
// не видны за пределами пакета.
type CoffeeMachine struct {
coffeeIsPrepared bool
waterIsBoiled bool
}
func (m *CoffeeMachine) MakeCoffee() bool {
m.grindCoffee()
m.boilWater()
return m.coffeeIsPrepared && m.waterIsBoiled
}
func (m *CoffeeMachine) grindCoffee() { m.coffeeIsPrepared = true }
func (m *CoffeeMachine) boilWater() { m.waterIsBoiled = true }
func main() {
coffeeMaker := &CoffeeMachine{}
fmt.Println(coffeeMaker.MakeCoffee()) // Выведет: true
}
class CoffeeMachine:
def __init__(self):
self.__coffee_is_prepared = False
self.__water_is_boiled = False
def __make_coffee(self):
self.__grind_coffee()
self.__boil_water()
return self.__coffee_is_prepared and self.__water_is_boiled
def __grind_coffee(self):
self.__coffee_is_prepared = True
def __boil_water(self):
self.__water_is_boiled = True
if __name__ == "__main__":
coffeeMaker = CoffeeMachine()
print(coffeeMaker.make_coffee())
class CoffeeMachine {
#coffeeIsPrepared = false;
#waterIsBoiled = false;
makeCoffee(): boolean {
this.#grindCoffee();
this.#boilWater();
return this.#coffeeIsPrepared && this.#waterIsBoiled;
}
#grindCoffee(): void {
this.#coffeeIsPrepared = true;
}
#boilWater(): void {
this.#waterIsBoiled = true;
}
}
const coffeeMaker = new CoffeeMachine();
console.log(coffeeMaker.makeCoffee()); // Выведет: true
public class CoffeeMachine {
private boolean coffeeIsPrepared = false;
private boolean waterIsBoiled = false;
public boolean makeCoffee() {
grindCoffee();
boilWater();
return coffeeIsPrepared && waterIsBoiled;
}
private void grindCoffee() {
coffeeIsPrepared = true;
}
private void boilWater() {
waterIsBoiled = true;
}
}
public class Program {
public static void main(String[] args) {
CoffeeMachine coffeeMaker = new CoffeeMachine();
System.out.println(coffeeMaker.makeCoffee()); // Выведет: true
}
}
class CoffeeMachine {
private var coffeeIsPrepared = false
private var waterIsBoiled = false
fun makeCoffee(): Boolean {
grindCoffee()
boilWater()
return coffeeIsPrepared && waterIsBoiled
}
private fun grindCoffee() {
coffeeIsPrepared = true
}
private fun boilWater() {
waterIsBoiled = true
}
}
fun main() {
val coffeeMaker = CoffeeMachine()
println(coffeeMaker.makeCoffee()) // Выведет: true
}
Четыре принципа рядом
Принципы ООП создают основу для качественного кода:
| Принцип | Преимущество | Пример |
|---|---|---|
| Наследование | Иерархии классов, повторное использование | Автомобиль → Грузовик |
| Полиморфизм | Единый интерфейс для разных объектов | Кнопка «Включить» |
| Инкапсуляция | Защита данных | Банкомат |
| Абстракция | Упрощение сложных систем | Кофемашина |
Домашнее задание
- Создайте иерархию
Transport→Car,Bicycle,Airplane. - Реализуйте
use_device(device)дляTelevision,Microwave,Radio. - Создайте класс
BankAccountс приватными полями и проверкой PIN.