2012-01-03 3 views
1

У меня есть 2 класса. Один из них составляет около 24 часов, а второй - подкласс первого и 12-часовой. Чтобы преобразовать новое время во втором классе, мне нужно изменить значение первого класса. Но я не могу этого сделать. Я говорю о «ч» переменная В частности ...Изменить значение переменной в подклассе?

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

Я хочу изменить переменную h, если setAMPM истинно. но я не изменюсь !! Это дает мне 00:00:00 – user1128538

+0

не должен 24-часовой часы EXTENSION для 12-часовых часов? –

+1

Вы должны перепроектировать свою структуру наследования: она находится в серьезном нарушении принципа замены [Лискова] (http://en.wikipedia.org/wiki/Liskov_substitution_principle), поскольку 12-часовой режим определенно * не * a 24-часовой режим.Вы должны иметь абстрактный базовый класс 'Clock', из которого вы получаете как 12-часовой, так и 24-часовой классы часов. – dasblinkenlight

ответ

1

Ваш AMPMClock должен либо просто расширить Clock или просто использовать его. Но вы пытаетесь объединить их обоих следующим образом:

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

Либо удлиняет:

class AMPMClock extends Clock { 

Поскольку методы общественных accesor наследуются, вы можете вызывать методы геттер/сеттер на this. например this.getHour().

Или использовать его, но не распространяются:

class AMPMClock { 
    Clock clock2 = new Clock(); 

Здесь вместо this использования clock2. например clock2.getHour().

Но вам нужно сделать все члены экземпляра закрытыми (они не должны быть общедоступными). И сделайте соответствующий публичный геттер/сеттер для всех из них.

Как было предложено dasblinkenlight:

Было бы лучше иметь абстрактный класс:

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

И два разных конкретных классов:

public class TwelveHourClock extends BaseClock { } 

и

public class TwentyFourHourClock extends BaseClock { } 
+0

да, но что я должен писать в BaseClock ?? потому что в классе Clock я написал общий код .. как его изменить и написать в другом классе 24-часовые часы ?? – user1128538

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 вам не нужны два Clock, так как AMPMClock - это часы. Наличие AM/PM, установленного на yes, просто сбивает с толку.

1

Тактический ответ - изменить click2 на «this». Стратегическая, большая проблема заключается в том, что они действительно не используют наследование должным образом.

Смежные вопросы