そもそもabstractクラスではなにができるのか?
具象クラスによって拡張(または実装)される抽象クラスを作成できる。
抽象クラスには抽象メソッド(本体は空)を含めることができます。
抽象クラスを継承するクラスは定義されているメソッドを必ず実装しないといけない。
例を交えて解説
Animalクラスを用いる
Animalクラスにはeat関数がある。
abstract class Animal {
void eat();
}
Animalクラスを継承したDogクラスを作成する
class Dog extends Animal {
@override
void eat() {
print('Dog is eating');
}
void sleep() {
print('Dog is sleeping');
}
}
eat関数はAnimalクラスにあるので必ず入れないといけない。
そのため、@override
を用いてAnimalクラスにあるeat関数を上書きする形で実行される
sleep関数は親クラスに抽象化されていないため、オーバーライドしなくてもいい。
仮にeat関数を実装しないとどうなるのか?
class Dog extends Animal {
void sleep() {
print('Dog is sleeping');
}
}
結果:エラーになる。
エラー文は以下。
Missing concrete implementation of 'Animal.eat'.
Try implementing the missing method, or make the class abstract.
和訳:Animal.eatの具体的な実装がありません。不足しているメソッド(今回はoverrideさせたeat関数のこと)を実装するか、クラスを抽象化して
解釈:継承しているクラス(Animalクラス)abstractクラスで定義されているにもかかわらず、実装していないため、エラーになっているってことを言っている。