up:: Programming
source:: 抽象クラスとは - 抽象クラスとインターフェース - Java入門

抽象クラス

クラスを作っていると、「下位クラスに必ず持たせたい名前のメソッド」が必要になるときがある。
しかし、それは必ずしも 「処理が必要なメソッド」でない ことがある。

abstract class AbstractHuman
{
    public void walk()
    {
        // 歩く処理
    }
 
    protected void talk()
	{
		// 話す処理(オーバーライド予定)
	}
}
 
class Human : AbstractHuman
{
    protected override void talk()
    {
        // 話す処理
    }
}

この時、AbstractHumanクラスのtalkメソッドはいつもオーバーライドされている。
単純に読むだけだと、talkはオーバーライド必須のメソッドであるとは見分けにくい。

そこで抽象クラスの出番。

abstract class AbstractHuman
{
    public void walk()
    {
        // 歩く処理
    }
 
    // 抽象メソッド
    abstract protected void talk();
}
 
class Human : AbstractHuman
{
    protected override void talk()
    {
        // 話す処理
    }
}

クラス頭にabsractをつけ、抽象メソッド持ちであることを明示する。
さらに抽象メソッド頭にもabstractをつけて、どれが抽象メソッドなのかわかりやすくする。

ポイントとして、抽象クラスは 単体でインスタンスを作れない。 必ずextendsで子クラスを作らなければならない。
また、抽象メソッドにはメソッドの中身を示す {}がない

強みは通常の親クラスと同じく、メソッドを持ち子クラスに渡せること。また、protectedが使えるのも強い。

なお、コードが複雑になるのでむやみやたらな実装はご法度。