2020-02-01に更新

Dartでmixinのstaticメソッドが直接呼べてしまう

どうもDartではmixinに実装しているstaticメソッドがそのまま呼べるっぽい。クラスに割り当てなくても。(Dart2.7現在)

そもそもmixinとは

普通、mixinは下記のような感じでclassと組み合わせてclassを拡張させて使うもの。

mixin Mixi {
    void test() {
        debugPrint('aaaa');
    }
}

class Tekito with Mixi {
}

でもそのまま呼べる

元々の経緯として、普通にmixinを使ってclassを拡張しようと思っていた。ただ、型の関係で色々ややこしかったのでやめにして、staticメソッドをたくさん実装したクラスを作ってそれを呼ぶだけにしよう、と思い、途中からクラスに変えてstaticメソッドを実装していった。

それでなんだかんだで実装を進めていった。ところが、ある時ふと見直してみると、mixinのままになっていた。classに変えるのを忘れている。ところが、いままで実装したところは全部問題なく動いている。

つまり、mixinのstaticメソッドは直接呼べてしまうっぽい。

なぜ?

なぜかはよくわからないが、そもそもDart1の時はmixinを定義する時にmixin MixinNameという感じでmixinという構文でmixinを定義する方法が無かった。普通にクラスとして定義することで、mixinとしても使える、という仕様だったっぽい。おそらくその名残でclassっぽい動きも残ってしまっているのではないかと思う。多分。

ちなみに、定義したmixinのインスタンスももしかしたら作れるのではないかと思ったがそれは無理だった。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 主にLAMPで開発しているWebエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, Vue.js, RoR 趣味:Elixir, Phoenix, Node, Nuxt, Express, React等色々

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

コメント