1. ホーム
  2. java

[解決済み] インターフェースにおける属性/メンバ変数?

2023-07-08 22:19:02

質問

オブジェクトのハンドルやプリミティブを、メソッドと同様に実装クラスで宣言することを義務付ける方法はないでしょうか。 たとえば、次のようになります。

public interface Rectangle {    
    int height = 0;
    int width = 0;

    public int getHeight();
    public int getWidth();
    public void setHeight(int height);
    public void setWidth(int width);                
}


public class Tile implements Rectangle{
    @Override
    public int getHeight() {
        return 0;
    }

    @Override
    public int getWidth() {
        return 0;
    }

    @Override
    public void setHeight(int height) {
    }

    @Override
    public void setWidth(int width) {   
    }

}

上記の方法で、タイルクラスが高さと幅の属性をインターフェイスを使って宣言するように強制するにはどうしたらよいでしょうか。なぜか、インターフェイスのみで行いたいのです!

最初は継承で使おうと思いました。 しかし、3つのクラスを扱わなければならないのです。

  1. 長方形
  2. タイル
  3. JLabel.

 class Tile extends JLabel implements Rectangle {}

はうまくいくだろう!

が、しかし

class Tile extends JLabel extends Rectangle {}

はないだろう!

どのように解決するのですか?

インターフェイスのポイントは、公開APIを指定することです。 インターフェースは状態を持ちません。 作成した変数はすべて実際のところ定数です(ですから、インターフェイスでミュータブルなオブジェクトを作成することには注意が必要です)。

基本的にインターフェースは、それを実装するクラスがサポートしなければならない全てのメソッドをここに書いています。Javaの作成者がインターフェイスで定数を許可しなかったのはおそらく良いことでしたが、今それを取り除くには遅すぎました(そして、インターフェイスで定数が賢明であるいくつかのケースがあります)。

どのメソッドが実装されなければならないかを指定しているだけなので、状態についての考え方はありません(インスタンス変数もありません)。 すべてのクラスが特定の変数を持つことを要求したいのであれば、抽象クラスを使用する必要があります。

最後に、一般的に言ってpublic変数は使わない方が良いので、変数をインターフェースに入れるという発想がそもそもダメです。

短い答え - Javaでは"間違った"であるため、あなたが望むことはできません。

編集してください。

class Tile 
    implements Rectangle 
{
    private int height;
    private int width;

     @Override
    public int getHeight() {
        return height;
    }

    @Override
    public int getWidth() {
        return width;
    }

    @Override
    public void setHeight(int h) {
        height = h;
    }

    @Override
    public void setWidth(int w) { 
        width = w;  
    }
}

は代替バージョンとなります。

abstract class AbstractRectangle 
    implements Rectangle 
{
    private int height;
    private int width;

     @Override
    public int getHeight() {
        return height;
    }

    @Override
    public int getWidth() {
        return width;
    }

    @Override
    public void setHeight(int h) {
        height = h;
    }

    @Override
    public void setWidth(int w) { 
        width = w;  
    }
}

class Tile 
    extends AbstractRectangle 
{
}