「こんにちは、アミーゴ! 興味深い新しいトピックがあります。」

今日は魅力的な話題ばかりの一日です!

"それはどうもありがとう!"

"どういたしまして。"

チェスの駒のすべてのクラスを簡素化するために ChessItem 基本クラスを導入したときのことを覚えていますか?」

"はい。"

「各ピースに、画面上でのレンダリングを処理するメソッドがあると想像してください。そのメソッドを呼び出すと、ピースは現在の座標で自身を描画します。このメソッドを基本クラスに移動すると便利でしょうか?」

"はい。" ポリモーフィズムについて学べば、タイプに関係なく、すべての部分に対して render メソッドを呼び出すことができるようになります。このようなもの:"

例えば:
class ChessBoard
{
  public void drawAllChessItems()
  {
  //draw them regardless of their type.
  ArrayList <ChessItem> items = new ArrayList<ChessItem>();
  items.add(new King());
  items.add(new Queen());
  items.add(new Bishop());

  //draw them regardless of their type.
  for (ChessItem item: items)
  {
   item.draw();
  }
 }
}

「よくできました。その通りです。それでは、ChessItem クラス自体の描画メソッドによって何が行われるでしょうか?」

「分かりません。チェスにはそのような駒はありません。つまり、視覚的な表現がないということです。」

「その通りです。そして、ChessItem オブジェクトを作成するのは意味がありません。そのようなチェスの駒はありません。これは単なる抽象、つまり便宜のために作成したクラスです。これが OOP での抽象化の仕組みです。重要な (共有された) オブジェクトはすべて移動しました。すべての駒で)データとメソッドを基本クラスに統合しましたが、特定のチェスの駒に対応するクラスではそれらの違いを維持しました。」

Java には、このための特別なクラス タイプである抽象クラスがあります。抽象クラスについて覚えておくべき 3 つの点を次に示します。

1) 抽象クラスは、メソッドを実装せずに宣言できます。このようなメソッドを抽象メソッドと呼びます。

例えば:
 public abstract class ChessItem
{
 public int x, y; //coordinates
 private int value; //the piece's "value"

 public int getValue() //an ordinary method, returns value
 {
   return value;
 }

 public abstract void draw(); //abstract method. There is no implementation.

}

2) 抽象メソッドは、キーワードabstractでマークされます。

クラスに抽象メソッドが 1 つでもある場合、そのクラスもabstractでマークされます。

3) 抽象クラスのオブジェクトは作成できません。そうしようとしたコードはコンパイルできません。

Javaコード 説明
ChessItem item = new ChessItem();
item.draw();
このコードはコンパイルできません。
ChessItem item = new Queen();
item.draw();
しかし、これならできます。

4)クラスが抽象クラスを継承する場合、継承されたすべての抽象メソッドをオーバーライドする必要があります。つまり、それらを実装する必要があります。それ以外の場合は、クラスも抽象として宣言する必要があります。クラス内で直接宣言された、または親クラスから継承された未実装のメソッドが 1 つでもクラスにある場合、そのクラスは抽象クラスとみなされます。

「しかし、なぜこれが必要なのでしょうか? なぜ抽象クラスが必要なのでしょうか? 代わりに通常のクラスを使用することはできないでしょうか? また、抽象メソッドの代わりに、中括弧の開きと閉じから構成される空の実装を作成することはできないでしょうか?」

「できます。しかし、これらの制限はprivate修飾子のようなものです。私たちはprivate修飾子を使用してデータへの直接アクセスを意図的にブロックし、他のプログラマとそのクラスが私たちのメソッドを使用できるようにしますpublic。」

抽象クラスにも同じことが当てはまります。クラスを作成した人は、誰にもクラスのインスタンスを作成されることを望んでいません。逆に、作成者は、自分の抽象クラスの抽象メソッドが継承され、オーバーライドされることを期待しています。

「なぜ私たちがこのように生活を複雑にしたいのか、私にはまだ理解できません。」

「この機能の利点は大規模なプロジェクトで明らかです。クラスが増えれば増えるほど、その役割をより明確に描写する必要があります。これを行うことの利点がすぐにわかるでしょう。誰もがこれを経験する必要があります。」