Абстрактные классы, методы и поля

Последнее обновление: 17.05.2021

Абстрактные классы

Абстрактные классы представляют классы, определенные с ключевым словом abstract. Они во многом похожи на обычные классы за тем исключением, что мы не можем создать напрямую объект абстрактного класса, используя его конструктор.

abstract class Figure {
}

// let someFigure = new Figure()	// Ошибка!

Как правило, абстрактные классы описывают сущности, которые в реальности не имеют конкретного воплощения. Например, геометрическая фигура может представлять круг, квадрат, треугольник, но как таковой геометрической фигуры самой по себе не существует. Есть конкретные фигуры, с которыми мы и работаем. В то же время все фигуры могут иметь какой-то общий функционал. В этом случае мы можем определить абстрактный класс фигуры, поместить в него общий функционал, и от него унаследовать классы конкретных геометрических фигур:

abstract class Figure {
	getArea(): void{
		console.log("Not Implemented")
	}
}
class Rectangle extends Figure{
	
	constructor(public width: number, public height: number){ 
		super();
	}
	
	getArea(): void{
		let square = this.width * this.height;
		console.log("area =", square);
	}
}

let someFigure: Figure = new Rectangle(20, 30)
someFigure.getArea();	// area = 600

В данном случае абстрактный класс определяет метод getArea(), который вычисляет площадь фигуры. Класс прямоугольника определяет свою реализацию для этого метода.

Абстрактные методы

Однако в данном случае метод getArea в базовом классе не выполняет никакой полезной работы, так как у абстрактной фигуры не может быть площади. И в этом случае подобный метод лучше определить как абстрактный:

abstract class Figure {
	abstract getArea(): void;
}
class Rectangle extends Figure{
	
	constructor(public width: number, public height: number){ 
		super();
	}
	
	getArea(): void{
		let square = this.width * this.height;
		console.log("area =", square);
	}
}

let someFigure: Figure = new Rectangle(20, 30)
someFigure.getArea();

Абстрактный метод не определяет никакой реализации. Если класс содержит абстрактные методы, то такой класс должен быть абстрактным. Кроме того, при наследовании производные классы обязаны реализовать все абстрактные методы.

Абстрактные поля

Также абстрактный класс может иметь абстрактные поля, то есть поля определенные с модификатором abstract. При наследовании класс-наследник также обязан предоставить для них реализацию:

abstract class Figure {
	abstract x: number;
	abstract y: number;
	abstract getArea(): void;
}
class Rectangle extends Figure{
	//x: number;
	//y: number;
	
	constructor(public x: number, public y: number, public width: number, public height: number){ 
		super();
	}
	
	getArea(): void{
		let square = this.width * this.height;
		console.log("area =", square);
	}
}

let someFigure: Figure = new Rectangle(10, 10, 20, 25)
someFigure.getArea();

В данном случае класс Figure определяет два абстрактных поля x и y, которые условно представляют начальную точку фигуры:

abstract x: number;
abstract y: number;

Класс Rectangle предоставляет для них реализацию с помощью определения полей через параметры конструктора:

constructor(public x: number, public y: number, public width: number, public height: number)

По большому счету в данном случае большого смысла в абстрактных полях нет, тем не менее TypeScript позволяет их применять.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850