オブジェクト向けプログラミング(Java)-抽象クラス


抽象クラス


クラスを設計図にたとえると、抽象クラスAbstract Classは未完成の設計図にたとえることができる.その名の通り、完成していない場合に残された設計図です.
未完成の設計図では製品が完成しないように、抽象クラスでインスタンスを作成することはできません.抽象クラスは、子クラスを継承することによってのみ実行できます.
なぜこの機能を使わなければならないのかと思いますが、これは新しいクラスを作成する際に、何もない状態から始めるよりも、不完全でもフレームワークから始めるのに役立ちます.製品でよく使われる機能を簡単に実装して操作すれば、後で他の派生製品を作成する際にもこれらの基礎を熟知して作成することができるので、便利な機能と考えられる.
未完成の設計図であっても、通常のクラスのようにメンバー変数とメソッドを持つことができます.
public abstract class A {
	int a;
    A() { a = 0; }
    A(int a) { this.a = a; } 
}
抽象クラスから継承されたサブクラスは、その祖先抽象クラスのすべての抽象メソッドを上書きすることによって実現する必要があります.親から継承された抽象メソッドが実装されていない場合は、子クラスを抽象クラスとして指定する必要があります.
abstract class A {
    abstract void func();
    void func2() {}
}

// Error! 반드시 추상 메서드인 func()를 오버라이딩 해줘야 해요
class B extends A {
    
}
基本的な構文はこの程度であり,例を用いて抽象クラスの必要性をある程度解消する.
abstract class Unit{
    abstract void move(int x, int y);
    abstract void attack();
    abstract void dead();
}


class Marine extends Unit {
    void move(int x, int y){
        System.out.println("발로 움직인다.");
    }
    void attack() {
        System.out.println("총을 갈긴다.");
    }
    void dead() {
        System.out.println("피를 흘리며 죽는다.");
    }
}

class Tank extends Unit {
    void move(int x, int y){
        System.out.println("바퀴를 돌아 움직인다. 탱크 모는 소리가 난다.");
    }
    void attack() {
        System.out.println("대포를 쏜다. 시즈 모드는 더 쎄고 느리게 쏜다.");
    }
    void dead() {
        System.out.println("펑~ 터지며 죽는다.");
    }
}
class Scourge extends Unit {
    void move(int x, int y){
        System.out.println("날라다닌다. 그래서 아무곳이나 돌아다닐 수 있다.");
    }
    void attack() {
        System.out.println("침을 뱉는다.");
    }
    void dead() {
        System.out.println("죽기전에 주변 놈들한테 피해를 주면서 죽는다.");
    }
}
一番上のUnitは移動する必要があり、攻撃したり、死亡したりすることもできます.したがって、このような辞書分類Unitを作成すると、この機能は存在しなければならないことを意味します.したがって、サブクラスはこの方法を強制的に実施することができる.
このようにクラス間の共通点を探し出し,共通メソッドを作成する作業を抽象化と呼ぶ.そして継承による実装方法を具体化と呼ぶ.
一時的な設計があるため、Unitに分類されたすべてのオブジェクトは、これらの機能を備えなければならず、各オブジェクトは固有の移動、攻撃、および死亡を実現することができる.もちろん?そう思うかもしれませんが、何千ものコードで実現する自信があれば...ああ、少なくとも私は自信がありません.ほほほ.皆さんはきっと抽象的な授業の意味を理解していると思います.