Dart 中 sealed class 和 final class 的使用详解

6 min read

在 Dart 语言中,sealed class 和 final class 都用来限制类的继承和派生,但它们的用法和含义有所不同。

一、sealed class

Dart 中的 sealed class(密封类)类似于 Kotlin 语言中的 sealed class,是指一类不能再被继承扩展的类。sealed class 只能有一组有限的子类,并且这些子类必须在该类内部定义,而不能在外部定义。

使用 sealed class 的好处是可以避免类层次结构的扩展过度,在编译期提前检查逻辑错误,使代码更加稳定可靠。

定义一个 sealed class 的方式如下:

sealed class Animal {
  Animal();
}

class Cat extends Animal {
  Cat() : super();
}

class Dog extends Animal {
  Dog() : super();
}

main() {
  Animal animal = Cat();
  animal = Dog();
}

在这个例子中,Animal 类是一个 sealed class。它的子类有 Cat 和 Dog,且在 Animal 类的内部定义。这样在编译期就可以检查开发者是否忘记定义某个子类。

二、final class

在 Dart 中,final class(最终类)是指一类完全不能被继承的类。final class 的定义和使用与普通类没有任何区别,只是它不能再被其他类继承。

使用 final class 的主要目的是防止类被滥用,增加代码的安全性和可维护性。

定义一个 final class 的方式如下:

final class Person {
  final String name;
  final int age;
  
  Person(this.name, this.age);
  
  void sayHello() {
    print("Hello, my name is $name, I am $age years old.");
  }
}

main() {
  Person person = Person("Tom", 20);
  person.sayHello();
}

在这个例子中,Person 类是一个 final class。它的属性和方法与普通类相同,但是它不能再被其他类继承。