Java

オブジェクト指向でRPGを作ってみる – 抽象クラスと継承

投稿日:

現在、BraveLabelとFieldLabelでは、ファイル名が異なる以外は同じ処理を行っています。

なので、共通の処理を別のクラスにまとめるように変更します。

アイコンを表示するためのラベルなので、IconLabelというクラスを作って、BraveLabelとFieldLabelはIconLabelを継承するように設計を変更しましょう。

IconLabelは、表示するファイル名が決まっていないので、インスタンス化されることはありません。このようなクラスを抽象クラスと呼びます。

抽象クラスはクラス宣言に abstract を追加して宣言します。

抽象クラスに対して、BraveLabelとFieldLabelはインスタンス化するクラスなので、具象クラスと呼びます。

Imageはクラス変数として保持するのですが、それらはIconLabelを継承したBraveLabelとFieldLabelのクラスで定義します。

それらの変数にアクセスするためのsetter/getterと、ファイル名を取得するメソッドを抽象メソッドで定義して、サブクラスで実装させることを強制します。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public abstract class IconLabel extends JLabel {
  public IconLabel() {
    Image image = getImage();
    if (image == null) {
      ImageIcon icon = new ImageIcon(getImageFilename());
      image = icon.getImage().getScaledInstance(RpgFrame.IconWidth, RpgFrame.IconHeight, Image.SCALE_SMOOTH);
      setImage(image);
    }
    setIcon(new ImageIcon(image));
    setBackground(Color.WHITE);
    setOpaque(true);
    setPreferredSize(new Dimension(RpgFrame.IconWidth, RpgFrame.IconHeight));
  }
  abstract String getImageFilename();
  abstract Image getImage();
  abstract void setImage(Image image);
}
import java.awt.Image;

public class BraveLabel extends IconLabel {
  private static Image image = null;
  public BraveLabel() {
    super();
  }

  @Override
  String getImageFilename() {
    return "brave.png";
  }

  @Override
  Image getImage() {
    return image;
  }

  @Override
  void setImage(Image image) {
    BraveLabel.image = image;
  }
}
import java.awt.Image;

public class FieldLabel extends IconLabel {
  private static Image image = null;
  public FieldLabel() {
    super();
  }

  @Override
  String getImageFilename() {
    return "grass.jpg";
  }

  @Override
  Image getImage() {
    return image;
  }

  @Override
  void setImage(Image image) {
    FieldLabel.image = image;
  }
}

-Java
-, , , ,

Copyright© UMLとJavaで学ぶオブジェクト指向プログラミング入門 , 2024 All Rights Reserved Powered by STINGER.