Dartでインターフェースを使ってクラスを実装する方法

2024年9月14日土曜日

Flutter

t f B! P L

Dartでのインターフェース宣言とクラスの実装方法

Dartにはinterfaceキーワードは存在しませんが、インターフェイスの概念はあります。
インターフェースを使用することで、クラスに対して特定の機能を強制的に実装させることができます。
この記事では、Dartでインターフェースを宣言する方法と、そのインターフェースを実装するクラスの作成方法、さらにDart 3で追加されたabstract classの使用方法を解説します。

基本的なインターフェースの宣言とクラスの実装

冒頭でも述べたように、Dartにはinterfaceキーワードがありません。しかし、クラスをインターフェースとして使用できます。特定のクラスをインターフェースとして使用する場合、そのクラスのメソッドを持つ他のクラスが、それを実装(implements)することになります。

インターフェースの宣言と実装例

まずは、こちらのサンプルコードを見てください。

// インターフェースとして使用されるクラス
class Animal {
  void makeSound() {
    print("Animal!");
  }
}

// インターフェースを実装したクラス(その1)
class Dog implements Animal {
  
  void makeSound() {
    print("Dog!");
  }
}

// インターフェースを実装したクラス(その2)
class Cat implements Animal {
  
  void makeSound() {
    print("Cat!");
  }
}

void main() {
  Animal dog = Dog();
  dog.makeSound(); // "Dog!"

  Animal cat = Cat();
  cat.makeSound(); // "Cat!"
}

普通のクラスとしてAnimalを宣言してますが、インターフェースとして機能します。
DogCatimplementsキーワードを使って、Animalを実装しています。このようにして、複数のクラスに共通するメソッドを持たせることができます。

Dart 3で追加されたabstract classの使用

Dart 3では、abstract classが導入され、具体的な振る舞いを持たないメソッドを持つクラスを宣言できるようになりました。抽象クラスは、インターフェースに似た役割を果たし、他のクラスがそれを継承してメソッドを実装する必要があります。

abstract classの宣言と実装例

こちらのサンプルコードを見てください。

// 抽象クラスの宣言
abstract class Shape {
  double area();
}

// 抽象クラスを継承して具体的なクラスを作成(その1)
class Circle implements Shape {
  final double radius;

  Circle(this.radius);

  
  double area() {
    return 3.14 * radius * radius;
  }
}

// 抽象クラスを継承して具体的なクラスを作成(その2)
class Square implements Shape {
  final double side;

  Square(this.side);

  
  double area() {
    return side * side;
  }
}

void main() {
  Shape circle = Circle(5);
  print("Circle area: ${circle.area()}"); // Circle area: 78.5

  Shape square = Square(4);
  print("Square area: ${square.area()}"); // Square area: 16
}

この例ではShapeという抽象クラスを宣言してます。このクラスにはarea()メソッドがありますが、具体的な実装は持っていません。
CircleSquareといったクラスがShapeを実装し、それぞれの形状に応じたarea()の計算する実装を提供します。
より、他の言語のインターフェイスっぽく実装できるようになりましたね。

プロパティの抽象化

プロパティも抽象化することが可能です。abstract class内に抽象プロパティを定義し、それを実装するクラスで具体的な値を持たせることができます。

// 抽象クラスに抽象プロパティを持たせる
abstract class Vehicle {
  String get brand; // 抽象プロパティのGetter
  set brand(

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

// 抽象プロパティと抽象メソッドを実装するクラス
class Car implements Vehicle {
  
  String get brand => "Toyota";

  
  void honk() {
    print("Beep beep!");
  }
}

class Bike implements Vehicle {
  
  String get brand => "Yamaha";

  
  void honk() {
    print("Ring ring!");
  }
}

まとめ

Dartでは、インターフェースとしてクラスを使用し、implementsキーワードを使用してそのクラスを実装できます。また、Dart 3で追加されたabstract classを活用すると、抽象化された共通のインターフェースを、具体的な実装クラスに委ねることができます。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ