🌊

【Flutter】入門!Dart基本「Constructor、Static、Override」

2023/11/18に公開

Constructor

Dartにおける「constructor(コンストラクタ)」は、クラスからオブジェクト(インスタンス)を作成し、そのオブジェクトを初期化するための特別なメソッドです。コンストラクタはクラスのインスタンスが生成される際に自動的に呼び出され、オブジェクトの初期化に使用されます。

Dartでは、以下の2つの主要なタイプのコンストラクタが存在します

デフォルトコンストラクタ(Default Constructor)

クラスが明示的にコンストラクタを定義しない場合、デフォルトコンストラクタが自動的に提供されます。
デフォルトコンストラクタは引数を受け取らず、何も初期化しないか、デフォルト値を使用して初期化します。

dart
class MyClass {
  // デフォルトコンストラクタ(引数なし)
}

パラメータつきコンストラクタ(Parameterized Constructor)

クラス内で独自のコンストラクタを定義できます。これにより、オブジェクトを初期化する際にパラメータを渡すことができます。
パラメータつきコンストラクタは通常、クラス内のプロパティを初期化するために使用されます。

dart
class MyClass {
  int value;

  // パラメータつきコンストラクタ
  MyClass(this.value);
}

コンストラクタは、クラスのインスタンスが作成される瞬間に実行されるため、オブジェクトの初期化に使用されます。デフォルトコンストラクタが提供される場合、オブジェクトを作成するときには特別にコンストラクタを指定しなくてもデフォルトコンストラクタが呼び出されます。パラメータつきコンストラクタは、オブジェクトの初期化に必要な情報を提供するために使用され、複数のコンストラクタを定義できます。

以下は、コンストラクタを使用してオブジェクトを作成および初期化する例です

dart
void main() {
  var obj1 = MyClass(42); // パラメータつきコンストラクタを使用してオブジェクトを作成
  print(obj1.value); // 出力: 42

  var obj2 = MyClass(); // デフォルトコンストラクタを使用してオブジェクトを作成
  print(obj2.value); // 出力: null (デフォルト値)
}

コンストラクタは、オブジェクト指向プログラミングの重要な概念の1つであり、オブジェクトの状態を正しく初期化するために不可欠な役割を果たします。

Static

Dartにおけるstaticキーワードは、クラスメンバー(フィールドやメソッド)がインスタンスではなくクラス自体に属することを示します。したがって、staticメンバーは特定のインスタンスに関連付けられず、クラス自体に関連付けられます。

staticキーワードは通常、クラスの共有されるデータやユーティリティメソッドを表すために使用されます。コンストラクタに関しては、クラスのインスタンスを作成する際に特定のコンストラクタを呼び出す必要があるため、通常はstaticキーワードはコンストラクタに直接使用されません。ただし、staticメソッドを使用してファクトリメソッド(Factory Method)を模倣する場合、コンストラクタの中でstaticキーワードを使用することがあります。

以下は、staticメソッドを使用してファクトリメソッドを実装する例です

dart
class MyClass {
  int value;

  // 通常のコンストラクタ
  MyClass(this.value);

  // ファクトリメソッド(staticメソッド)
  static MyClass createInstance(int value) {
    return MyClass(value);
  }
}

void main() {
  // 通常のコンストラクタを使用してオブジェクトを作成
  var obj1 = MyClass(42);
  print(obj1.value); // 出力: 42

  // ファクトリメソッドを使用してオブジェクトを作成
  var obj2 = MyClass.createInstance(30);
  print(obj2.value); // 出力: 30
}

この例では、createInstanceというstaticメソッドを使用してMyClassのインスタンスを作成しています。このメソッドはクラス自体に関連付けられており、クラスのインスタンスを作成するための別の手段を提供します。

ただし、通常のコンストラクタはstaticキーワードを必要とせず、クラスのインスタンスを直接作成できます。staticキーワードは主にクラスメソッドやクラス変数に使用されます。

override

Dartでのoverrideキーワードは、サブクラスでスーパークラスのメソッドやプロパティを再定義する際に使用されます。これは、オーバーライドしたメソッドがスーパークラスの同名のメソッドを置き換え、サブクラスで新しい実装を提供することを示します。overrideキーワードはあくまで可読性向上のためのアノテーションで、省略しても正しく動作します。

以下に、メソッドのオーバーライド例を示します

dart
class Animal {
  void makeSound() {
    print('Generic animal sound');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Bark! Bark!');
  }
}

void main() {
  var myDog = Dog();
  myDog.makeSound(); // Dogクラスでオーバーライドされたメソッドが呼び出される
}

この例では、DogクラスがAnimalクラスを拡張しています。Dogクラスでは、makeSoundメソッドをoverrideキーワードを使用してオーバーライドしています。その結果、myDog.makeSound()が呼び出されると、Dogクラスの実装が呼び出されます。

プロパティのオーバーライドも同様に行うことができます。オーバーライドを使用すると、サブクラスはスーパークラスのメソッドやプロパティを再定義でき、それによって特定の挙動を変更したり拡張したりできます。ただし、オーバーライドするメソッドやプロパティは、スーパークラスでvirtualやabstractキーワードを使用して宣言されている必要があります。

Discussion