Dart: Self タイプの実現方法

Dart: Self タイプの実現方法

June 9, 2024

現在 Dart には Self 型を表すようなキーワードはありません。キーワードはないものの、Self 型を実現することはでき、具体的には次のように書けば実現可能です。若干奇妙な書き方です。

class MyData<T extends MyData<T>> {}

以下の Issue でも触れられています。

具体的なサンプルコードは以下をご覧ください。

@immutable
abstract class MyData<T extends MyData<T>> {
  T copyWith();

  bool equals(T other);

  @override
  operator ==(Object other) =>
      identical(this, other) ||
      other is T && runtimeType == other.runtimeType && equals(other);

  @override
  int get hashCode => runtimeType.hashCode;
}

@immutable
class MyPersonData extends MyData<MyPersonData> {
  MyPersonData(
    this.name,
    this.age,
  );

  final String name;
  final int age;

  @override
  MyPersonData copyWith({
    String? name,
    int? age,
  }) =>
      MyPersonData(
        name ?? this.name,
        age ?? this.age,
      );

  @override
  bool equals(MyPersonData other) => name == other.name && age == other.age;
}