2012-01-03 67 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。这个战略性的,更大的问题是没有正确地使用继承。