Изменить значение переменной в подклассе? - PullRequest
1 голос
/ 03 января 2012

У меня есть 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**;
        }
    }
}

Ответы [ 4 ]

1 голос
/ 03 января 2012

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

1 голос
/ 03 января 2012

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

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

Любое расширение:

class AMPMClock extends Clock {

Поскольку методы общедоступного доступа наследуются, вы можете вызывать методы getter / setter для 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 голосов
/ 03 января 2012

Похоже, вы запутались в разнице между классами и объектами.

проверить: http://www.codestyle.org/java/faq-Objects.shtml#classobjectdiff

0 голосов
/ 03 января 2012

Вы можете просто написать

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 - это такт.Установка AM / PM на yes просто сбивает с толку.

...