2012-01-03 15 views
1

私は2つのクラスを持っています。 1つは約24時間の時計で、2番目の時計は1番目の時計のサブクラスで、12時間の時計です。 新しい時刻を第2クラスに変換するには、最初のクラスの値を変更する必要があります。しかし、私はそれをすることはできません。 私はあなたはそれが設定されている場合hourを検証しなければならないサブクラスの変数の値を変更しますか?

class AMPMClock extends Clock { 
    private boolean pm = false; 
    public void setHour(int hour) { 
    if (hour >= 12) { 
     hour -= 12; 
     pm = true; 
    } else { 
     pm = false; 
    } 
    super.setHour(hour); 
    } 
    public void setPM(boolean pm){ 
    this.pm = pm; 
    } 
} 

を書くことができる "H" 変数 具体的に...

class Clock{ 
    public int h, m , s; 
    public String a,b,c; 

    public void setHour(int hour){ 
     this.h = hour; 
    } 
    public void setMin(int min){ 
     this.m = min; 
    } 
    public void setSec(int sec){ 
     this.s = sec; 
    } 
    public void tick(){ 
     if(h != 23){ 
      if(m == 59 && s==59){ 
       m = 0; 
       s=0; 
       h++; 
      } 
      else if(m != 59 && s == 59){ 
       m++; 
       s=0; 
      } 
      else if (m != 59 && s != 59){ 
       s++; 
      } 
      else if(m == 59 && s!=59){ 
       s++; 
      } 
     } 

     else if(h == 23 && m == 59 && s !=59){ 
      s++; 
     } 
     else if(h == 23 && m!=59 && s == 59){ 
      s=0; 
      s++; 
      m++; 
     } 
     else if(h == 23 && m!=59 && s!=59){ 
      s++; 
     } 
     else if(h == 23 && m == 59 && s == 59){ 
      s = 0; 
      m =0; 
      h = 0; 
     } 
    } 
    public String toString(){ 
     a = ""; 
     b = ""; 
     c = ""; 

     if (h < 10) 
      a = "0"; 
     if (m <10) 
      b = "0"; 
     if (s <10) 
      c = "0"; 

     return a+h+":"+b+m+":"+c+s; 
    } 
} 

    class AMPMClock extends Clock{ 
    Clock clock2 = new Clock(); 
    public void setAMPM(boolean yes){ 
     if(yes == true){ 
      **clock2.h = clock2.h - 12**; 
     } 
    } 
} 
+0

setAMPMがtrueの場合、h変数を変更します。しかし、私は変わりません!それは私に00:00:00 – user1128538

+0

24時間のクロックを12時間の時計の延長ではないはずですか? –

+1

継承構造を再設計する必要があります.Liskov置換原則(http://en.wikipedia.org/wiki/Liskov_substitution_principle)に厳しい違反をしています。これは、12時間のクロックが間違いなく* 24時間制です。あなたは抽象基本クラス 'Clock'を持っていなければなりません。このクラスから、12時間と24時間の両方のクロッククラスが得られます。 – dasblinkenlight

答えて

1

あなたAMPMClockどちらかだけClockを拡張したり、それを使用する必要があります。どちらの

class AMPMClock extends Clock { 
    Clock clock2 = new Clock(); 

を拡張:あなたは次のようにそれらの両方を組み合わせるためにしようとしている。しかし

class AMPMClock extends Clock { 

をパブリックaccesorメソッドが継承されている、ので、あなたはthisにgetter/setterメソッドを呼び出すことができます。例えば​​。

か、またはそれを使用しますが、拡張しない:

class AMPMClock { 
    Clock clock2 = new Clock(); 

をここでは、代わりにthis使用clock2の。例えばclock2.getHour()

しかし、すべてのインスタンスメンバーを非公開にする必要があります(パブリックにしないでください)。それに対応するパブリックゲッター/セッターを作成します。

dasblinkenlightによって示唆されるように:

抽象クラスを持っている方が良いでしょう:

public abstract class BaseClock { 
    private int h, m, s; 
    //getter/setter 
} 

異なる2つの具象クラス:

public class TwelveHourClock extends BaseClock { } 

public class TwentyFourHourClock extends BaseClock { } 
+0

はい、しかし、私はBaseClockで何を書くべきですか? Clockクラスでは、私は一般的なコードを書いているので..それを変更し、別のクラスで24時間のクロックを書く方法? – user1128538

0

について話しています。フィールドはすべてプライベートにする必要があります。時間はゲッターを&秒に設定してください。 AMPMClockはクロックであるため、AMPMClockでは2つのクロックは必要ありません。 AM/PMをyesに設定すると、混乱するだけです。

1

戦術的な答えは、「this」でclick2を変更することです。戦略的で大きな問題は、実際に継承を適切に利用していないことです。

関連する問題