序文
java&kotlinとは異なり、dartには特別なキーワードmixin(mix-in)があります。このキーワードを使用するクラスが他のクラスに含まれている場合、他のクラスにはこのクラスのメソッドがあります。このようにして、コードを拡張せずに再利用できます。
ミックスインの使用方法を示すシナリオ
エクステントと実装はjavaとkotlinでよく使用され、ミックスインの使用方法がわからないため、理解に役立ついくつかの特別な例を示します。
シナリオのユースケース
上のumlの写真に示されているように、鳥は親クラスであり、鳥に必要なスキルは(産卵と歩行)であり、ガチョウとスズメはサブクラスとして飛ぶことができますが、ペンギンは飛べません。その後、飛行は個々の鳥のスキルになります。親クラスで飛行が定義されている場合、ペンギンには空の実装があります。飛行を実装するためのインターフェースを定義する場合は、飛ぶことができる鳥を飛ばすためのコードを書き直す必要があります。これを簡単にする方法。次に、mixin(with)を使用して次のコードを実装します。
abstract class Bird{
void walk() { print('我会走路'); }
void xiadan() { print('我会下蛋'); }
}
abstract class Fly{
void fly() { print('我会飞'); }
}
//大雁
class Dayan extends Bird with Fly {}
//企鹅
class Qier extends Bird {}
复制代码
Flyクラスを通常のクラスとして使用することを意図していない場合は、classをキーワードmixinに置き換えてください。
mixin Fly{
void fly() { print('我会飞'); }
}
复制代码
Flyクラスを鳥だけに限定したい場合は、次のキーワードを追加する必要があります
mixin Fly on Bird{
void fly() { print('我会飞'); }
}
复制代码
ミックスイン機能
- mixinにはコンストラクターがなく、インスタンス化できません
- インターフェースとして使用でき、クラスが混在した後に実装する必要があります
- エラーでない場合は、onを使用して混合クラスタイプを指定できます。
- withの後に複数のクラスに同じメソッドがある場合、現在のクラスがメソッドをオーバーライドすると、現在のクラスのメソッドが呼び出されます。メソッドが現在使用されているクラスによってオーバーライドされていない場合、withキーワードから最も遠いクラスのメソッドが呼び出されます。
コールシーケンス表示
単純な順次呼び出し
withの後に複数のクラスに同じメソッドがある場合、現在のクラスがメソッドをオーバーライドすると、現在のクラスのメソッドが呼び出されます。メソッドが現在使用されているクラスによってオーバーライドされていない場合、withキーワードから最も遠いクラスのメソッドが呼び出されます。
abstract class First {
void doPrint() {
print('First');
}
}
abstract class Second {
void doPrint() {
print('Second');
}
}
class Father {
void doPrint() {
print('Father');
}
}
class Son extends Father with First,Second {
}
复制代码
移行:
Son son = Son();
son.doPrint();
复制代码
印刷:
Second
复制代码
書き換え後に呼び出されます
class Son extends Father with First,Second {
void doPrint() {
print('Son');
}
}
复制代码
移行:
Son son = Son();
son.doPrint();
复制代码
印刷:
Son
复制代码
親クラスのメソッド呼び出しを使用
class Father {
void init() {
print('Father init');
}
}
mixin FirstMixin on Father {
void init() {
print('FirstMixin init start');
super.init();
print('FirstMixin init end');
}
}
mixin SecondMixin on Father {
void init() {
print('SecondMixin init start');
super.init();
print('SecondMixin init end');
}
}
class Son extends Father with FirstMixin, SecondMixin {
@override
void init() {
print('Son init start');
super.init();
print('Son init end');
}
}
复制代码
移行:
Son().init();
复制代码
印刷:
flutter: Son init start
flutter: SecondMixin init start
flutter: FirstMixin init start
flutter: Father init
flutter: FirstMixin init end
flutter: SecondMixin init end
flutter: Son init end
复制代码
説明する
仕方 | の種類 | 説明する |
---|---|---|
と | 混入します | このコンテンツに混ぜる |
オンで | 混入します | このクラスのコンテンツを混ぜますが、それは特性のタイプでなければなりません |
注意を払う
ミックスインは複数のクラスに含めることができますが、withの前のクラスにはすでに関連する実装が必要です
mixin Mix on Mix1,Mix2{ }
复制代码