const bmwAuto = {
name: 'BMW',
model: 'X6',
year: 2024,
getAutoType() {
return `${this.name} ${this.model} - ${this.year}`
}
}
class Auto {
constructor(name, model, year) {
this.name = name
this.model = model
this.year = year
}
getAutoType() {
return `${this.name} ${this.model} - ${this.year}`
}
}
// Instance creation
const bmwAuto = new Auto('BMW', 'X6', 2024)
const audiAuto = new Auto('Audi', 'Q7', 2020)
const teslaAuto = new Auto('Tesla', '3', 2019)
bmwAuto.getAutoType() // BMW X6 - 2024
audiAuto.getAutoType() // Audi Q7 - 2020
teslaAuto.getAutoType() // Tesla 3 - 2019
Наследование в объектно-ориентированном программировании — это концепция, согласно которой одни классы, называемые родительскими, могут лежать в основе других — дочерних. При этом, дочерние классы перенимают свойства и поведение своего родителя.
class TeslaCar extends Auto {
constructor(name, model, year) {
super(name, model, year)
this.name = name
this.model = '${model} Model'
this.year = year
}
getCarModel() {
return this.model
}
}
// Instance creation
const teslaAuto = new TeslaCar('Tesla', '3', 2019)
// Own method
teslaAuto.getCarModel() // 3 Model
// Inherited method
teslaAuto.getAutoType() // Tesla 3 - 2019
Инкапсуляция (от лат. in capsule — в оболочке) — это заключение данных и функциональности в оболочку. В ООП в роли оболочки выступают классы: они не только собирают переменные и методы в одном месте, но и защищают их от вмешательства извне (сокрытие).
class Auto {
public name: string
public model: string
public year: number
private vin: number
constructor(name: string, model: string, year: number) {
this.name = name
this.model = model
this.year = year
this.vin = new Date().getTime()
}
get vinNumber() {
return this.vin
}
}
const audiAuto = new Auto('Audi', 'Q7', 2020)
audiAuto.name // Audi
audiAuto.model // Q7
audiAuto.vin // Property 'vin' is private...
audiAuto.vinNumber // 1635164984459
Полиморфизм даёт возможность использовать одни и те же методы для объектов разных классов.
class BmwCar extends Auto {
getAutoType() {
return `${this.year}, ${this.name}, ${this.model}`
}
}
class AudiCar extends Auto {
getAutoType() {
return `${this.year}, ${this.name} ${this.model}`
}
}
class TeslaCar extends Auto {
getAutoType() {
return `${this.name} ${this.model} / ${this.year}`
}
}
const bmwAuto = new BmwCart('BMW', 'X6', 2024)
const audiAuto = new AudiCart('Audi', 'Q7', 2020)
const teslaAuto = new TeslaCar('Tesla', '3', 2019)
const getAutoTypes = autos => autos.map(auto => auto.getAutoType())
const autoTypes = getAutoTypes([bmwAuto, audiAuto, teslaAuto])
// ['2024, BMW, X6', '2020, Audi Q7', 'Tesla 3 / 2019']
interface AutoFactory {
readonly name: string
readonly model: string
year: number
getAutoType(): string
}
class Auto implements AutoFactory {
public name: string
public model: string
public year: number
constructor(name: string, model: string, year: number) {
this.name = name
this.model = model
this.year = year
}
getAutoType() {
return `${this.name} ${this.model} / ${this.year}`
}
}
abstract class AutoFactory {
readonly name: string
readonly model: string
year: number
abstract getAutoType(): string
getAutoModel(): string {
return this.model
}
}
class Auto extends AutoFactory {
public name: string
public model: string
public year: number
constructor(name: string, model: string, year: number) {
super()
this.name = name
this.model = model
this.year = year
}
getAutoType() {
return `${this.name} ${this.model} / ${this.year}`
}
}
const bmwAuto = new Auto('BMW', 'X6', 2024)
// Own method
bmwAuto.getAutoType() // BMW X6 / 2024
// Inherited from abstract class method
bmwAuto.getAutoModel() // X6
class Engine {
start() {
return 'Engine is started'
}
}
class Wiring {
start() {
return 'Wiring is started'
}
}
class FuelPump {
start() {
return 'FuelPump is started'
}
}
class Car {
constructor() {
// Composition
this.engine = new Engine()
this.wiring = new Wiring()
this.fuelPump = new FuelPump()
}
start() {
this.engine.start()
this.wiring.start()
this.fuelPump.start()
}
}
class Autopilot {
navigate() {
return 'Navigation is started'
}
}
class Car {
constructor(autopilot) {
this.engine = new Engine()
this.wiring = new Wiring()
this.fuelPump = new FuelPump()
this.autopilot = autopilot
}
start() {
this.engine.start()
this.wiring.start()
this.fuelPump.start()
}
}
const bmwAuto = new Car(new Autopilot())
bmwAuto.start()
bmwAuto.autopilot.navigate()
class Airplane {
constructor(autopilot) {
this.autopilot = autopilot
}
}
const boeing = new Airplane(new Autopilot())
class Helicopter {
constructor(autopilot) {
this.autopilot = autopilot
}
}
const mi8 = new Helicopter(new Autopilot())
Источник: Просто о ООП (Парадигмы ООП)
Теги: [[Typescript/README]], [[oop]]