Dartでは既存のクラスに自分がほしいと思うメソッドを足し込んで機能拡張をすることができます。
例を見ていきましょう。
DateTime
は日時を扱うためのクラスですが、時刻の情報は不要で日付だけほしいというケースには対応していません。
そこで、日付のみを取得できるようにdateOnly
というメソッド(厳密にいうと今回はゲッター)をDateTime
クラスに追加してみようと思います。
まずは以下のようにextension
を定義し、その中に自分が使いたいメソッドを書きます。
extension DateTimeExtension on DateTime {
DateTime get dateOnly {
return DateTime(year, month, day, 0, 0, 0);
}
}
書き方としては最初の行でextension Extensionの名称
on 拡張したいクラス名
とします。
あとはその中にいつもと同じようにメソッドのコードを書くことができます。
3行目のようにyear
やmonth
など、元々DateTime
に備わっているメソッドを利用することができます。
あとはDateTime
が存在するところであればどこでも拡張メソッドのdateOnly
を呼び出すことができます。
print(DateTime.now().dateOnly); // 2022-03-03 00:00:00.000 を取得できる!
staticメソッドも拡張メソッドとして追加できるのでしょうか?
たとえばDateTime.special_method()
のようにメソッドを追加できるかというと、それはできないようです。
コード的には以下のように書いてもエラーにはならないようですが
extension DateTimeExtension on DateTime {
static int special_method() {
return 1;
}
}
使用するときはDateTimeExtension.special_method()
としなければ呼び出せないようです。
これだと、普通に自分でクラスを作ってstaticメソッドを作った方がよさそうです。
拡張メソッドは積極的に使い込む機能ではないかもしれませんが、プロジェクト内で高頻度かつ、どこでからも呼び出されるような処理や時刻や文字列などに汎用的に使える便利機能を準備したいケースでは拡張メソッドを使った方が便利になることはありそうですね。