Модификатор final у класса
Модификатор final перед объявлением класса
запрещает наследование от этого класса
и его реализацию в других классах. Такой класс
нельзя расширить через extends,
нельзя реализовать через implements,
нельзя примешать через with.
При этом сам final-класс может наследоваться
от других классов и реализовывать интерфейсы.
Модификатор final гарантирует, что
поведение класса не будет изменено через
наследование. Это полезно для классов,
которые должны оставаться неизменными
и предсказуемыми.
Синтаксис
final class ClassName
{
// body
}
Пример
Давайте объявим final-класс
и создадим его экземпляр:
final class Point
{
final int x;
final int y;
const Point(this.x, this.y);
}
void main()
{
Point p = const Point(1, 2);
print('${p.x}, ${p.y}');
}
Результат выполнения кода:
"1, 2"
Пример
Попытка наследоваться от final-класса
приведет к ошибке компиляции:
final class Point
{
final int x;
final int y;
const Point(this.x, this.y);
}
// Error: The type 'Point' can't be
// extended because it's 'final'
class Point3D extends Point
{
final int z;
const Point3D(super.x, super.y, this.z);
}
void main()
{
Point3D p = const Point3D(1, 2, 3);
print('${p.x}, ${p.y}, ${p.z}');
}
Результат выполнения кода:
Error: The type 'Point' can't be extended because it's 'final'
Пример
final-класс может наследоваться
от другого класса и реализовывать интерфейсы:
abstract class Shape
{
double area();
}
final class Circle extends Shape
{
final double radius;
const Circle(this.radius);
@override
double area()
{
return 3.14 * radius * radius;
}
}
void main()
{
Circle c = const Circle(2);
print(c.area());
}
Результат выполнения кода:
12.56