2016-11-30 11 views
1

私は、家庭内の家電製品で使用されているエネルギー消費量を登録することに基づいたプログラムを作成しています。これまでは、WaterMeter、GasMeterなどのさまざまなメータークラスを作成しました。空のメソッドには値を設定する必要があります。また、各アプライアンス内のエネルギー消費を登録するメソッドを持つアプライアンスのクラスも作成しました。私が現在取り組んでいるのは、コンストラクタ内に保存されているエネルギー値を適用し、その値をtimePasses()メソッドに入れて、その値を特定のメーターのメソッドに戻して登録できるようにすることです。これは私がこれまで持っているものです。コンストラクタから値を渡す必要があるメソッドを構築するには?

アプライアンスクラスの例:

public class ElectricShower extends Shower 
{ 

    public int isOn = -1; 
    public int isOff = 0; 
    public int incrementTime; 
    public int x = -1; 

    private static ElectricMeter instance = new ElectricMeter(); 
    public static ElectricMeter getInstance() { return instance; } 

    @Override 
    public int currentState() 
    { 

     if (x == 0) 
     return isOff; 
     else 
     { 
      return isOn; 
     } 
     //returns isOn; 
} 

     @Override 
     public void useTime(int defaultTime) 
     { 

      defaultTime = 15; 
      incrementTime = 1; 

     } 

     public void shower() 
     { 

      //call timePasses() method 

     } 

     @Override 
     public int timePasses() 
     { 

      if(x == isOff) 
       return 0; 
      else 
      { 
      ElectricMeter.getInstance().incrementConsumed(electricityUse);    
      } 

     } 

    ElectricShower(int electricityUse, int gasUse, int waterUse, int timeOn) 
{ 
    super(electricityUse, gasUse, waterUse, timeOn); 


    this.electricityUse = 12 * incrementTime; 
    this.gasUse = 0 * incrementTime; 
    this.waterUse = 4 * incrementTime; 
    this.timeOn = 15 * incrementTime; 

} 

} 

メーターの例:

public class ElectricMeter 
{ 
public int incrementConsumed(int value) 
    { 

    } 

    public int incrementGenerated() 
    { 

    } 
    public boolean canGenerate() 
    { 

    } 
    public String getConsumed() 
    { 

    } 
    public String getGenerated() 
    { 

    } 

} 

私は次に何をする必要がある何がある:

  1. の値はelectricityUsewaterUsetimePasses() else文の中でtimePasses()他staement
  2. 内でそれらを格納し、ElectricMeterクラス内incrementGenerated()方法でelectrcityUseの価値を置き、waterUse変数に対して同じことを行います。

UPDATE

クラスはまだそれを動作させる方法を見つけるのに苦労し、更新されています。

答えて

0

まず、すべてのアプライアンスが拡張されているApplianceクラスがあるとします。あなたの代わりに公共の場の常に使用ゲッターとセッター必要があることを

public class Appliance 
{ 
    public int electricityUse, gasUse, waterUse, timeOn; 
    // ... 
} 

注:あなたは、電気、ガス、水道の使用量を格納Applianceクラスの変数を作成する必要があります。私は怠け者:else句を書くこと

ElectricShower(int electricityUse, int gasUse, int waterUse, int timeOn) 
{ 
    super(electricityUse, gasUse, waterUse, timeOn); 
    // I don't know why you multiply the constant by incrementTime here. Seems weird. I think you can remove them. 
    this.electricityUse = 12 * incrementTime; 
    this.gasUse = 0 * incrementTime; 
    this.waterUse = 4 * incrementTime; 
    this.timeOn = 15 * incrementTime; 

} 

一つの方法は、「シングルトンパターン」を使用することです:上記の変数が設定されますように、D

はあなたのコンストラクタを変更し

。 、

public int incrementConsumed(int value) 
{ 
    // logic here... 
} 

else句では:incrementConsumed方法で

private ElectricMeter() {} 
private static ElectricMeter instance = new ElectricMeter(); 
public static ElectricMeter getInstance() { return instance; } 

は、あなたがインクリメントするどのくらいの示すパラメータを受け入れる必要があります:すべてのメータークラスで

は、このような何かを書きます次のようにしてください:

ElectricMeter.getInstance().incrementConsumed(electricityUse); 
GasMeter.getInstance().incrementConsumed(gasUse); 
WaterMeter.getInstance().incrementConsumed(waterUse); 
+0

あなたのフィードバックのおかげで、私は 'private ElectricMeter(){}'の行についてちょっと混乱しました。まずこれは何をするのですか?第2に、私はそれを実装するとき、引数がなく、int、int、int、intが必要なので、コンストラクタを適用できないというエラーが出る可能性があります。 – Tom

+0

これは、コードの他の部分がメーターのインスタンスを作成しないようにするためです。このエラーが発生した場合、ElectricMeterはスーパークラスを継承しているようです。これは、メーターが何かを継承しない場合にのみ機能します。 @Tom – Sweeper

+0

メータークラスは、Meterというスーパークラスから継承します。私は私の質問の中で私のクラスを更新した、それはまだそれを動作させる方法を考え出すことはまだできません。返信いただきありがとうございます。 – Tom

0

y私たちのデザイン。

あなたはあなただけの値を返すいわゆるゲッターメソッドを作成公共またはより良い、それを定義することができ、クラスのパラメータにアクセスする必要がある場合。

例:私は見るあなたのコードで

public class MyData { 
    public int counter; 
} 

.... 
// Some other class 
MyData data = new MyData(); 

data.counter = 5; 

System.out.println(data.counter); 

それとも

public class MyData { 
    private int counter; 
    public void setCounter(int counter) { 
     this.counter = counter; 
    } 
    public int getCounter() { 
     return this.counter; 
    } 
} 

.... 
// Some other class 
MyData data = new MyData(); 

data.setCounter(5); 

System.out.println(data.getCounter()); 

public int incrementConsumed() 
{ 
    //Store value of electricityUse. 
} 

しかし、この方法では、単に整数を返す必要がありますし、入力を取得するパラメータしていません保存する。

それは次のようになります。

public void incrementConsumed(int amount) { 
    this.amount += amount; 
} 

私はこのラインが心配です:

gasUse = 0 * incrementTime; 

あなたはに何かを掛けた場合、それは常に ...

になります
関連する問題