🐕

【Flutter】入門!Dart基本「Mixin、Abstract」

2023/12/09に公開

Mixin

DartのMixin(ミックスイン)は、複数のクラス階層からコードを再利用するための機能です。Dartは単一継承の言語であり、クラスは1つの親クラスしか持てませんが、Mixinを使用することで、異なるクラスから機能や振る舞いを取り込むことができます。

Mixinはwithキーワードを使用してクラスに適用されます。Mixinは通常、独自のフィールドを持たず、主にメソッドの提供に焦点を当てます。これにより、クラスが特定の機能を共有でき、コードの再利用性が向上します。

dart
mixin Swimming {
  void swim() {
    print('Swimming');
  }
}

class Dolphin with Swimming {}

class Bird {
  void fly() {
    print('Flying');
  }
}

class FlyingFish extends Dolphin with Bird {}

void main() {
  var dolphin = Dolphin();
  dolphin.swim(); // Swimming

  var flyingFish = FlyingFish();
  flyingFish.swim(); // Swimming
  flyingFish.fly();  // Flying
}

この例では、SwimmingというMixinがDolphinクラスに適用されています。MixinのswimメソッドがDolphinクラスで使用可能になります。

Mixinはクラスの機能を組み合わせ、柔軟で効果的なコードの構築を可能にします。しかし、Mixinを使用する際にはコードの整理や衝突の回避など、注意が必要です。

Abstract

Dartにおけるabstract(抽象)は、クラスやメソッドを抽象化し、具体的な実装を提供せずに定義するためのキーワードです。抽象クラスや抽象メソッドを使用することで、他のクラスに対して共通の構造や振る舞いを規定することができます。

抽象クラスの例

dart
abstract class Animal {
  String name;

  Animal(this.name);

  void makeSound(); // 抽象メソッド
}

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void makeSound() {
    print('$name is barking.');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);

  @override
  void makeSound() {
    print('$name is meowing.');
  }
}

void main() {
  var myDog = Dog('Buddy');
  var myCat = Cat('Whiskers');

  myDog.makeSound(); // Buddy is barking.
  myCat.makeSound(); // Whiskers is meowing.
}

上記の例では、Animalという抽象クラスがあります。このクラスには抽象メソッドmakeSoundが定義されています。DogクラスとCatクラスはそれぞれAnimalクラスを継承し、抽象メソッドをオーバーライドして実装します。

抽象メソッドの例

dart
abstract class Shape {
  void draw(); // 抽象メソッド
}

class Circle extends Shape {
  @override
  void draw() {
    print('Drawing a circle');
  }
}

class Square extends Shape {
  @override
  void draw() {
    print('Drawing a square');
  }
}

void main() {
  var circle = Circle();
  var square = Square();

  circle.draw(); // Drawing a circle
  square.draw(); // Drawing a square
}

こちらの例では、Shapeという抽象クラスがあり、drawという抽象メソッドが定義されています。CircleクラスとSquareクラスはこれを実装し、それぞれのクラスで異なる描画ロジックを提供しています。

抽象クラスや抽象メソッドを使用することで、共通の振る舞いを持つクラスの基盤を提供し、サブクラスに対して一貫性のあるインターフェースを提供することができます。

Discussion