extends vs implements vs with vs on
extends |
implements |
with |
on |
|
|---|---|---|---|---|
| 対象 | - class- abstract class
|
- class- abstract class- abstract interface
|
- mixin
|
- class- mixin
|
| 複数指定 | 不可 | 可 | 可 | 不可 |
| 親の具象メソッド | 引き継ぐ オーバーライドも可能 |
引き継がない オーバーライドが 強制される |
引き継ぐ | 引き継ぐ |
| 親の抽象メソッド | 実装を強制されない | 実装を 強制される | 実装を 強制される | 実装を強制されない |
super の使用(親クラスへのアクセス) |
可 | 不可 | 不可 | 不可 |
-
抽象メソッド は
abstract class/abstract interface/mixinで定義可能
@override
https://dart.dev/language/extend#:~:text=The%20return%20type,a%20generic%20one.
オーバーライドする時の注意点
- 戻り値は、元の定義と同じクラスか、サブクラスに限定される
- 引数は、元の定義と同じクラスか、スーパークラスに限定される
- ジェネリックを使ったメソッドは、非ジェネリックとしてオーバーライドできない
- ジェネリックを使わないメソッドは、ジェネリックと使うメソッドとしてオーバーライドできない
abstract キーワード
Flutter の abstract キーワードが使える対象は以下の通り。
- クラス
- 抽象クラスの定義(
abstract class MyAbstract {})
- 抽象クラスの定義(
- フィールド
- ただし、抽象クラス内での使用に限る(通常クラス内で抽象メソッドは定義できない)
- サブクラスで getter / setter の実装が強制される(フィールドのオーバーライドでも可)
抽象メソッドは抽象クラスもしくは mixin(abstract で定義したクラス。abstract interface class でも良いが、interface class ではダメ。)でしか定義することができない。
抽象クラス
abstract class MyAbstract {
}
抽象メソッド
abstract class MyAbstract {
void method();
}
abstract interface class MyInterface {
void method();
}
mixin MyMixin {
void method();
}
抽象フィールド
abstract class MyAbstract {
abstract int x;
}