[Flutter]Dart3で追加されたClass Modifier

はじめに

Google I/O 2023でDart3のリリースが報告されました。 Dart3でClass Modifierが追加されたので試してみました。 (Class Modifierとは、抽象Classの頭につけているabstractなどです)

interfaceクラス

// vehicle.dart
interface class Vehicle {
  void drive() {
    print('drive');
  }
}

このVehicleクラスが定義されたファイルとは別ファイルで使う場合に下記の特長があります。

  1. インスタンス化できる
  2. 継承できない
  3. implementsできる
// car.dart
import 'vehicle.dart';

// インスタンス化できる
final myCar = Vehicle();

// 継承できない(エラーになる)
class Car extends Vehicle {
  String name;
  Car({
    required this.name,
  }) : super();
}

// implementsできる
class Truck implements Vehicle {
  String name;
  Truck({
    required this.name,
  }) : super();

  @override
  void drive() {
    print('drive truck');
  }
}

baseクラス

// vehicle.dart
base class Vehicle {
  void drive() {
    print('drive');
  }
}

このVehicleクラスが定義されたファイルとは別ファイルで使う場合に下記の特長があります。

  1. インスタンス化できる
  2. 継承できる。ただし、base or finalのクラスに限る
  3. implementsできない
// car.dart
import 'vehicle.dart';

// インスタンス化できる
final myCar = Vehicle();

// 継承できる。base or finalでなければならない
base class Car extends Vehicle {
  String name;
  Car({
    required this.name,
  }) : super();
}

final class Bus extends Vehicle { }

// implementsできない
base class Truck implements Vehicle {
  String name;
  Truck({
    required this.name,
  }) : super();

  @override
  void drive() {
    print('drive truck');
  }
}

finalクラス

// vehicle.dart
final class Vehicle {
  void drive() {
    print('drive');
  }
}

このVehicleクラスが定義されたファイルとは別ファイルで使う場合に下記の特長があります。

  1. インスタンス化できる
  2. 継承できない
  3. implementsできない
// car.dart
import 'vehicle.dart';

// インスタンス化できる
final myCar = Vehicle();

// 継承できない
base class Car extends Vehicle {
  String name;
  Car({
    required this.name,
  }) : super();
}

// implementsできない
base class Truck implements Vehicle {
  String name;
  Truck({
    required this.name,
  }) : super();

  @override
  void drive() {
    print('drive truck');
  }
}