質問: this.readImage(url); } @Override public void attack(敵){ 敵.hp -= 200; this.hp -= 50; } // その他の処理は省略 } ``` ### なぜ疑問に思ったか 1. こういった記述のコードを見たことがないから 2. php を教わった先生に、「抽象クラスに実装があってもあまりうれしくない」と言っていたことを思い出したから
回答: 別に非抽象メソッドをもっていても問題ないと思います。抽象クラスの性質の一つ「派生クラスの共通の親」として運用するうえで、共通メソッドやフィールドを書いておくというのはありえるはずです。ただ、抽象メソッドを一つでも持つのであればそれは抽象クラスでなければなりません。 抽象クラスの最たる性質は「直接インスタンス化できない」ことです。派生クラスに、抽象メソッドを具象化することを要求します。そして、派生先が抽象メソッドの存在しない具象クラスとなれば、これに対してインスタンス化が可能となります。 要するに、「派生前提の中間的な共通部品」とかの意味合いがあります。 もちろん、すべてのフィールドをなくしてメソッドをabstructにしても問題はありません。ただし、それをするならばInterfaceで充分です。しかもjavaの場合は、Intefaceは多重実装可能(classの多重継承は不可能)なので、Intefaceの方が適切です。