LoginSignup
4
3

More than 1 year has passed since last update.

DartにおけるInterfaceの扱い

Posted at

Dartにおけるインターフェースの扱いを、swiftとの相違点からまとめてみました。
get/setについては既知であるとします。

インターフェースってなに?

まず、インターフェース(Interface) とは、オブジェクト指向型プログラミングによって認められた具体的な実装を持たない抽象型のことです。
swiftではprotocolキーワードを用いて実装されます。

swiftでの実装例
// Buildingプロトコルの定義
protocol Building {
    var height: Double { get }
    var area: Double { get }
    func volume() -> Double
}

// Buildingプロトコルに準拠したHouseクラス
class House: Building {
    let height: Double
    let area: Double

    init(height: Double, area: Double) {
        self.height = height
        self.area = area
    }
    
    func volume() -> Double {
        return height * area
    }
}

例えば、ここでHouseクラスで定義されている定数areaの宣言部分を削除してみましょう。
すると、次のようなエラーメッセージが表示されます。

swiftでのerror
Type 'House' does not conform to protocol 'Building'

インターフェース内(swiftではプロトコル内)に定義されたものは、そのインターフェースを準拠した型の中で実装が必須となることがわかります。

Dartにおけるインターフェース

次にDartではインターフェースがどのように実装されるかを確認します。
公式ドキュメントを確認すると、次のような記述が見つかります。

Dart has no interface keyword. Instead, all classes implicitly define an interface. Therefore, you can implement any class.

翻訳すると、Dart言語にはinterfaceキーワード(swiftでいうprotocol)が存在しない代わりに、全ての型において暗黙的なインターフェースが定義されているとのことです。
公式ドキュメントが紹介しているプログラム例を元に確認してみましょう。

公式プログラム例
class Person {
    // interfaceが存在している
    final String _name;
    String greet(String who) => 'こんにちは、$who。私は$nameです。';
    // コンストラクタにはinterfaceは存在していない
    Person(this._name);
}

class Impostor implements Person {
    String get _name => '';
    String greet(String who) => 'こんにちは、$who。私が誰だか知っていますか?';
}

implementsがあるクラス(インターフェース)を準拠していることを表すものです。
Personクラスにおいて定義されているfinal変数 _namegreet関数は、インターフェースの観点に基づき、Impostorクラスにおいて再度定義され直さなければなりません。

では一般に、swiftでのprotocolキーワードのような表現をDartでするにはどうしたら良いのでしょうか?

abstractキーワード

abstractキーワードとは、抽象型を作成する際にDartで用いられるものです。
Dartにおける実装例を確認してみましょう。

dartでの実装例
abstract class Building {
  final double height;
  final double area;
  Building({required this.height, required this.area});
  double? volume() {}
}

class House implements Building {
  final double height;
  final double area;
  House({required this.height, required this.area});
  double volume() {
    return this.height * this.area;
  }
}

void main() {
  final House house = House(height: 100, area: 100);
  print(house.volume());
}

Buildingクラスにabstractキーワードを付与することで、swiftのように抽象型のインターフェースとして扱うことができるようになりました。

参考ページ

dart公式ドキュメント
Dartのabstractとは?-Zenn

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3