【问题标题】:Why my inheritance application is not working?为什么我的继承应用程序不起作用?
【发布时间】:2014-08-06 20:13:28
【问题描述】:

我正在做一个过去的学校作业,它是关于一个带有子类时钟的微波应用程序。不知何故,我对自己的代码感到困惑,完全迷失了方向。有人可以帮我解决这些吗?谢谢!

首先是时钟类。

class Clock extends Microwave {

private int hour;
private int minute;
private int second;

Clock()
{
    hour = 0;
    minute = 0;
    second = 0;     
}

Clock(int h, int m, int s)
{
    hour = h;
    minute = m;
    second = s;
}

public int getHour()
{
    return hour;
}

public int getMin()
{
    return minute;
}

public int getSec()
{
    return second;
}

public String toString()
{
    return (String.valueOf(second));
}

protected void tick()
{
    second++;

    if(hour == 23 && minute == 59 && second == 59)
    {
        hour = 0;
        minute = 0;
        second = 0;
    } else if(minute == 59 && second == 59)
    {
        hour++;
        minute = 0;
        second = 0;
    } else if(second == 59)
    {
        minute++;
        second = 0;
    }
}
}

接下来是父类 Microwave。

class Microwave {

private int maxPower;
private int currentPower;
private Clock theClock;

Microwave()
{
    maxPower = 500;
    currentPower = 500;
    theClock = new Clock();
}

Microwave(int maxp, Clock theClock)
{
    maxPower = maxp;
    currentPower = maxPower;
    theClock = new Clock();
}

public int getCurrentPower()
{
    return currentPower;
}

public int getMaxPower()
{
    return maxPower;
}

public String getTime()
{
    return "The time is " + theClock.getHour() + ":" + theClock.getMin() + ":" + theClock.getSec();
}

protected void cook(int p, int t)
{
    if(p < maxPower)
    {
        currentPower = p;
    } else
    {
        System.exit(0);
    }

    for(int i = 0; i < t; i++)
    {
        theClock.tick();
    }
}
}

最后是main方法类。

class TestMicrowave
{
 public static void main(String []args)
 { 
    Clock  c = new Clock(14, 30,30);
    Microwave  m = new Microwave(750, c);
    System.out.println("The microwave is currently at " + 
                     m.getCurrentPower() + " watts and "+ m.getTime());


     m.cook(600,45);    // should advance time to  14:31:15

     System.out.println(m.getTime());

     m.cook(800,45);    // shoudln't cook as power > maxPower
     System.out.println(m.getTime());

 }
 }

我认为,我在 Microwave 类中的 getTime() 方法有问题,但我不知道它有什么问题。 提前致谢!

【问题讨论】:

  • 不是相反吗?我的意思是,微波炉有时钟,但时钟不能做饭:-)
  • 时钟不应延长微波。时钟是微波炉的组成部分。
  • 这是一个糟糕的任务。绝对没有理由 Clock 应该扩展 Microwave。一个 Microwave 可能包含一个时钟(它将“组合”它,即包含一个成员。),或者实现一些时钟功能。
  • 是的,你们有一个很好的观点,我刚刚意识到。 :S 这项工作是几年前的。

标签: java inheritance extends


【解决方案1】:

时钟不是子类。微波炉由时钟组成。从 Clock 类中删除“extends Microwave”。

在这个设计中不应该有任何继承。

【讨论】:

  • 但我认为这些类应该有关联?
  • @Scorpiorian83 他们这样做:微波炉包含时钟:) 我想这是微波炉和时钟之间的唯一关联
  • 子类提供IS-A 关系,时钟不是微波炉。然而微波HAVE-AClock 是组成。
【解决方案2】:

继承建议是垃圾,您应该改为编写时钟(微波炉可能包含时钟,因为您的 Microwave 类已经编写),所以从您的 Clock 类中删除 extends Microwave

除了这个问题,另一个问题是您的 CTOR:

Microwave()
{
    maxPower = 500;
    currentPower = 500;
    theClock = new Clock();
}

Microwave(int maxp, Clock theClock)
{
    maxPower = maxp;
    currentPower = maxPower;
    //theClock = new Clock(); // you're passing a reference to this already, so by using this call you replace it with a new instance via the default ctor of Clock().
    this.theClock = theClock;
}

【讨论】:

  • 嘿嘿,你说我已经传递了一个引用,但是我传递到哪个部分?它是无参数构造函数吗?对不起,我仍然是一个新手,希望向大家学习并更多地了解整个事情。 :)
  • 当您声明 Clock c; 时,您只是创建了一个对时钟对象的“引用”,它没有引用任何内容(或 null)(将其想象为未与您的电视配对的遥控器)。 c 不是实际对象,它只是允许您控制它。因此,在您的代码中,您使用Clock c = new Clock(14, 30, 30); - 这里c 是对您创建的对象(电视,在本例中)的引用(远程控制)。当您将其传递给new Microwave 时,您只需授予它控制/使用您制作的时钟的权限。
  • @Scorpiorian83 我认为您只是对菱形符号感到困惑。菱形符号表示聚合和组合。对于继承,您使用三角形符号。
【解决方案3】:

接受Clock 参数的构造函数将丢弃它,因此您始终从零时钟开始。

Microwave(int maxp, Clock clock)
{
    maxPower = maxp;
    currentPower = maxPower;
    this.theClock = clock;
}

【讨论】:

  • 嗨,戴夫,呃,我不太明白。为什么我从零时钟开始?干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多