2012-01-03 108 views
1

我有2個班。一個是24小時制的時鐘,第二個是第一個的子類,是12小時的時鐘。 要轉換第二課中的新時間,我需要更改第一課的價值。但我不能那樣做。 我說的 「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 2012-01-03 19:30:51

+0

不應該把24小時制延長到12小時制嗎? – 2012-01-03 19:31:23

+1

你應該重新設計你的繼承結構:它嚴重違反了[Liskov替代原則](http://en.wikipedia.org/wiki/Liskov_substitution_principle),因爲12小時制肯定不是* a 24小時制。你應該有一個抽象的基類'Clock',你可以從中得到12-h和24-h時鐘類。 – dasblinkenlight 2012-01-03 19:32:26

回答

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()

但是,您需要使所有實例成員都是私有的(他們不應該公開)。併爲它們製作相應的公共getter/setter。

至於建議的dasblinkenlight:

這將是最好有一個抽象類:

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

和兩種不同的具體類:

public class TwelveHourClock extends BaseClock { } 

public class TwentyFourHourClock extends BaseClock { } 
+0

是的,但我應該在BaseClock中寫什麼?因爲在鍾類我寫了一般的代碼..如何改變它,並寫在不同的課24小時? – user1128538 2012-01-04 08:03:41

0

你可以只寫

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; 
    } 
} 

hour應在其設置進行驗證。這些場都應該是私人的,你應該在一小時內吸氣,分鐘&秒。由於AMPMClock是一個時鐘,所以在AMPMClock中不需要兩個時鐘。上午/下午設置爲yes只是令人困惑。

1

戰術答案是用「this」改變click2。這個戰略性的,更大的問題是沒有正確地使用繼承。