2017-09-20 22 views
-2
子部材を介してアクセス

I持ってここに次のような場合:静的メンバの継承とJava

Room { price; } 
     | 
     ------ 
    /  \ 
standard suite 

が、私はそれがstandardのすべてのインスタンスで静的なままであるようで標準的な部屋の価格を設定したいとsuiteの価格に影響してはならないし、その逆もありません。私はpriceRoomクラスstaticに保存しようとしており、子クラスのgetterとsetterでアクセスしていますが動作しません。私はその解決策が気に入らないので、それぞれの子クラスのメンバーをpriceにすることには消極的です。たぶん別の美しいOOPソリューションがあるかもしれません。

+0

、私はあなたの条件が悪い決断「私はそれが標準のすべてのオブジェクトに静的なままであるように、標準的な部屋の価格を設定する」を検討してください。あなたはそれを再考すべきです。客室料金は、誰が予約したか、いつ(少なくともほとんどのホテルで)いつ、同じ日に同じ物理的な部屋であっても個人である場合があります。 – Fildor

+0

あなたは美しいOOPソリューションを求めていますが、静的な制限を使って解決しています。 *なぜ*価格は静的である必要がありますか? –

+0

@Fildorだが悲しいことに、それは必要ではない – AghaKhan

答えて

-1

RoomSuiteクラスの両方に別のstaticフィールドを持つことは、最も簡単で簡単な解決方法です。

  Room 
    _________|_______ 
    /    \ 
Standard    Suite 
|      | 
`static int price;  `static int price; 

代わりに、各Room型のベース価格を格納Roomクラスでstatic Map<Class<? extends Room>, Integer>を作成することができます。

public class Room { 
    private static Map<Class<? extends Room>, Integer> prices = 
      new HashMap<>(); 

    public final int getRoomBasePrice() { 
     // If a Room subclass does not have a specific base price, return 
     // 1000 by default. 
     return Room.prices.getOrDefault(this.getClass(), 1000); 
    } 

    /** Sets the base price for the specified Room type. 
    */ 
    public final void setRoomBasePrice(int price) { 
     Room.prices.put(this.getClass(), price); 
    } 
} 

上記のコードを使用すると、クラスのすべてのインスタンスで価格が一定に保たれます。あなたの実際の質問とは関係のない

mySuite.setRoomBasePrice(2000); 
(new Suite()).getRoomBasePrice(); // -> 2000 
+2

"...これは唯一の解決策です**" - 私はそれを疑っています... – Fildor

+0

あなたが提供した解決策は 'static'変数なしで使うこともできます。それはちょうど "... **これの解決策の1つ**"私はむしろ言うでしょう。 – procrastinator

+0

@Fildor、あなたは正しいです。オブジェクト指向の、もう1つのソリューションを追加しました。 – mgthomas99