ПРИМЕР
database
Есть класс database, у которого есть url, port, username, password (пароль пользователя, который подключается к базе данных). Значение этих свойств мы присваиваем внутри этого конструктора. При это класс содержит в себе список таблиц для этой базы данных (по умолчанию это пустой массив). Свойства изменять мы не можем, но можем получать, поэтому для всех этих свойств мы создаём соответствующие get. При этом нам так же необходимо научится добавлять таблицы в массив _tables. Для мы создадим отдельно метод (аргументом мы будем принимать новую таблицу и добавлять эту таблицу в массив). т.е. таки образом с помощью специального публичного метода мы взаимодействуем с массивом tables, при этом напрямую этот массив мы изменять не можем и можем изменять только с помощью специального метода для которого предназначен.
class Database{
private _url;
private _port;
private _username;
private _password;
private _tables;
constructor(url, port, username,password) {
this._url = url;
this._port = port;
this._username = username;
this._password = password;
this._tables = [];
}
public createNewTable(table){
this._tables.push(table);
}
public clearTables(){
this._tables=[];
}
get url(){
return this._url;
}
get port(){
return this._port;
}
get username(){
return this._username;
}
get password(){
return this._password;
}
get tables(){
return this._tables;
}
}
Создадим объект с помощью этого класса и если мы сейчас попробуем взять и присвоить таблицам tables пустой массив или же добавить какой-то элемент, то у нас ни чего не получится. Зато мы можем взять и вызвать специальный для этого метод и передать туда соответствующий объект. При этом если у нас возникнет всё же удалить эти таблицы из массива, мы также можем сделать соответствующий метод внутри класса и затем в нужном для нас месте этот метод просто вызвать. В этом и кроется основная суть инкапсуляции и сокрытие.
const db = new Database(1,2,3,4);
db.createNewTable({'roles'});
db.createNewTable({'users'});
db.tables = [];//error
db.clearTables();
наследование
переиспользовать код
получать свойства и методы от родительского класса
- возможность создавать иерархию классов
- эти классы обладают своими уникальными свойствами и методами
- каждый наследуемый класс принимает свойства и методы от родительского класса
существуют другие способы взаимодействия между классами
Композиция
автомобиль объект содержит внутри себя другие объекты двигатель и четыре колеса, которые не могут существовать вне объекта автомобиль
(они являются составными частями автомобиля и создаются внутри его)
Агрегация
передача объекта из вне. Она может существовать вне автомобиля. Например Человек.
полиморфизм
много форм
некоторый принцип, который позволяет одному и тому же кода отработать с разными типами данных
на нём построено большинство принципов паттернов
Два типа
- ad-hoc мнимый
оба метода называются одинаково
принимают одинаковые параметры, но разных типов
например один работает с числами, а другой со строками
происходит за счёт перегрузки методов
— приведение типов так же считается ad-hoc
дочерний класс преобразовываем к родительскому - параметрический истинный
мы работаем с объектами, которые наследуются от базового класса, имеющий метод, который в объектах может срабатывать по разному или объект создан из наследуемого класса, в котором изменили тело метода