Для чего используются классы в TypeScript? Как они поддерживают принципы объектно-ориентированного программирования?
Подсказки:
- Какова роль классов в инкапсуляции данных и поведения.
- Подумайте о том, как наследование позволяет классам расширять и повторно использовать код.
- Поразмышляйте об использовании модификаторов доступа, таких как
public
,private
иprotected
в классах.
Превосходя ожидания:
- Концепцию полиморфизма и то, как классы TypeScript могут реализовывать интерфейсы.
- Как статическая типизация TypeScript может повысить надёжность проектов, основанных на классах.
- Роль абстрактных классов и то, как они предоставляют шаблон для других классов.
Мы можем использовать классы в TypeScript для инкапсуляции данных и поведения, поддерживая ключевые принципы объектно-ориентированного программирования, такие как инкапсуляция, наследование и полиморфизм. Классы в TypeScript предоставляют структурированный способ определения свойств и методов, которые будет иметь объект, тем самым предлагая шаблон для создания объектов.
Инкапсуляция
Инкапсуляция подразумевает объединение данных (свойств) и методов (функций), которые работают с данными, в единый блок — класс. Этот подход помогает управлять сложностью и повышать повторное использование кода. В TypeScript инкапсуляция усиливается с помощью модификаторов доступа:
-
public
: Члены, объявленные какpublic
, доступны из любой точки. По умолчанию все члены класса являютсяpublic
.class Person { public name: string; constructor(name: string) { this.name = name; } }
-
private
: Члены, объявленные какprivate
, могут быть доступны только внутри класса, в котором они объявлены. Это ограничивает доступ к чувствительным данным или методам, которые не должны быть раскрыты.class Person { private age: number; constructor(age: number) { this.age = age; } }
-
protected
: Члены, объявленные какprotected
, доступны внутри класса и его подклассах. Это полезно, когда нужно разрешить доступ к члену в производных классах, но не извне.class Person { protected gender: string; constructor(gender: string) { this.gender = gender; } }
Наследование
Наследование — это механизм, в котором новый класс (подкласс) наследует свойства и поведение от существующего класса (суперкласса). Это позволяет повторно использовать код и создавать иерархическую структуру классов. Используйте ключевое слово extends
, чтобы реализовать наследование в TypeScript:
class Animal {
public name: string;
constructor(name: string) {
this.name = name;
}
public speak(): void {
console.log(`${this.name} издает звук.`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
public speak(): void {
console.log(`${this.name} лает.`);
}
}
Полиморфизм
Полиморфизм позволяет обращаться к объектам как к экземплярам их родительского класса, что позволяет одному интерфейсу представлять различные базовые формы (типы данных). Реализуйте полиморфизм в TypeScript, используя классы и интерфейсы:
interface Shape {
area(): number;
}
class Circle implements Shape {
public radius: number;
constructor(radius: number) {
this.radius = radius;
}
public area(): number {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle implements Shape {
public width: number;
public height: number;
constructor(width: number, height: number) {
this.width = width;
this.height = height;
}
public area(): number {
return this.width * this.height;
}
}
Абстрактные классы
Абстрактные классы не могут быть инстанцированы и используются для определения шаблона для других классов. Они могут содержать абстрактные методы, которые должны быть реализованы производными классами:
abstract class Vehicle {
public abstract move(): void;
public start(): void {
console.log("Транспортное средство запущено.");
}
}
class Car extends Vehicle {
public move(): void {
console.log("Автомобиль движется.");
}
}
Статическая типизация
Статическая типизация TypeScript повышает надежность конструкций на основе классов, обеспечивая проверку типов на этапе компиляции. Это уменьшает ошибки во время выполнения и улучшает качество кода:
class Product {
public price: number;
constructor(price: number) {
this.price = price;
}
public getPriceWithTax(taxRate: number): number {
return this.price * (1 + taxRate);
}
}