ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

抽象クラス

コンポジションとデリゲーションの時に継承を意識したクラス設計〜みたいな話があったかと思うけど、抽象クラスはまさにそういうクラスです。というよりも、文法で継承することを強制しています。抽象クラスは、クラスとしての実装が不完全で、インスタンスも立ち上げられないクラスです。この不完全なクラスに実装された機能を使用する為には、このクラスを継承して、不完全なメソッドをオーバライドして、メソッドの中身を実装してあげないといけません。

  • 抽象クラスの決まり
    • 実装のないメソッドを宣言する
    • クラスをabstractと宣言する
    • その他は一般的なクラスと同じ
    • 抽象メソッド(宣言のみで実装のないメソッド)がひとつでもあれば、抽象クラスとなる(抽象メソッド自体はなくてもいい)
abstract class AbClass {
    abstract long calc(long a , long b);     //抽象メソッド(宣言だけで実装がない)
    void disp(String a){
        System.out.println(a);
    }
}

class ConClass extends AbClass{
    @Override
    long calc(long a , long b) {  //オーバーライドして、実装内容を記述するとクラスとして使えるようになる。
        long l;
        l = a * b;
        return l;
    }
}

public class AbMainClass {
    public static void main(String[] args) {
         ConClass con = new ConClass();
       //  AbClass abc = new AbClass();  抽象クラスでインスタンスを作ろうとしてるので、コンパイルエラーとなる
         con.disp(Long.toString((con.calc(10, 20))));
    }
}

ここでは、AbClassをConClassが継承して、実装が不完全だったcalcクラスをオーバーライドして実装しています。(@overrideはアノテーション)
こうすることによって、AbClassの実装をConClassを通して使用することができます。使用するには、ConClassのインスタンスを作り、メソッドを呼ぶだけです。抽象クラスの具体的な利用方法は、別途書きたいと思います。