[解決済み] インターフェースにおける属性/メンバ変数?
質問
オブジェクトのハンドルやプリミティブを、メソッドと同様に実装クラスで宣言することを義務付ける方法はないでしょうか。 たとえば、次のようになります。
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つのクラスを扱わなければならないのです。
- 長方形
- タイル
- 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
{
}
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
型に解決できない エラー解決
-
Javaでよくある構文エラー
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
maven レポート エラー 解決不可能な親POM
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
-
[解決済み] JavaにおけるRunnableインターフェースとCallableインターフェースの違いについて
-
[解決済み】TypeScriptのインターフェースと型について
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
-
[解決済み】トレイトとインターフェイスの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
ジャバアレイ
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
アクセス制限の解決方法: ---- in Java
-
Zipファイルの圧縮・解凍にantを使用する