抽象クラスとは

広告

クラスを継承する時にスーパークラスで定義されたメソッドを、サブクラスにてオーバーライド(上書き)することが出来ますが、サブクラスで必ずオーバーライドされるようなメソッドもあります。

例えば全ての製品の基礎となるスーパークラスを作成し、個々の製品は必ずスーパークラスを継承したクラスを作成するとします。そして全てのサブクラスには製品名を表示するための「dispName」メソッドを定義することとしましょう。

class base{
  public void dispName(){
    /* 特に何もしない */
    System.out.println("Alert:個別のクラスで再定義して下さい。");
  }

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

class seihinA extends base{
  public void dispName(){
    System.out.println("製品Aです");
  }
}

class seihinB extends base{
  public void dispName(){
    System.out.println("製品Bです");
  }
}

「dispName」メソッドは製品の名前を表示するメソッドですので、それぞれのクラスで別々の処理が必要となります。ただそれぞれのクラスで適当なメソッド名を使われると困りますのでスーパークラスでメソッドを用意することで、スーパークラスを継承するサブクラス全体でこのメソッド名を使うように推奨することが出来ます。

このようにサブクラスで用意して欲しいメソッドとしてスーパークラスでメソッドを用意はするけれども、スーパークラス自体では何の定義も必要無いようなメソッドの場合、メソッドの中身を書かずに定義することが可能です。

普通のメソッドは下記のようになっています。

メソッド名(引数, 引数, ...){
    メソッドの中身
}

これに対して中身が無いメソッドは下記のように記述します。

abstract メソッド名(引数, 引数, ...);

通常はメソッドの中身を記述する"{"と"}"が無く、メソッド名の後に直ぐにセミコロン(;)を記述しています。つまりどんなメソッドなのかだけ記述してあり、中身が無いわけです。このようなメソッドを抽象メソッドといいます。

抽象メソッドはメソッド名の先頭に「abstract」を付けて区別します。

抽象メソッドを使って先ほどのサンプルを書き直すと下記のようになります。

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

class seihinA extends base{
  public void dispName(){
    System.out.println("製品Aです");
  }
}

class seihinB extends base{
  public void dispName(){
    System.out.println("製品Bです");
  }
}

baseクラスの先頭にも「abstract」が付いています。これは抽象メソッドが1つでも含まれるクラスは、クラスそのものが抽象クラスとなるためです。つまり「中身が無いメソッドが少なくとも1つ含まれているクラス」と言うわけです。抽象クラスを定義する場合には、クラス名の先頭に「abstract」を付けます。

抽象メソッドと言うのは、メソッド名だけ定義された状態ですので、この抽象メソッドが含まれる抽象クラスを継承したサブクラスでは、必ずこのメソッドをオーバーライドして実際の中身を定義しなければいけません。その結果、サブクラスに必ず同じメソッド名の再定義を行わせることが出来るようになるわけです。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)