3

我正在学习基本的 Java,阅读 Head First Java 的基本概念(多态性、抽象类/方法、覆盖等),现在我正在做一个非常简单的示例,其中遥控器用于电视、家庭影院和 Cd 播放器。一个遥控器必须完美适用于所有 3 台设备。现在我所做的是..

  • 遥控器是所有这 3 类电视、家庭影院、CD 播放器的超级类。
  • 基本功能如 on , off , volume +-, channel +- 等属于超类,这些被覆盖
  • 那些不常见的方法在 Eject、Insert、Cd 播放器、电视和剧院的显示设置等接口中实现。

    那么这种方法可以吗?

将一个类作为超类并在接口中实现其余代码。

还有一点,if one method is common in Tv and theater like Display settings should i implement interface or change my class hierarchy .

请不要介意它是否愚蠢的问题,也请指导我这些oop设计技术,谢谢

4

5 回答 5

7

在实现继承(超类-子类逻辑)之前,请始终进行Is-A测试。电视是遥控器吗?不......那么你的方法是错误的。在我看来,它必须是一个接口。电视必须实现不扩展远程。并不是说只要有通用代码,就可以使用继承来避免重复。

开、关、音量+-、频道+-等基本功能必须在远程接口中,所有其他电视类都必须实现它们。

public Class TV implements Remote

此外,如果您想使用继承,您可以拥有像ElectronicGadget这样的 SupeClass 。您所有的电视、家庭影院、CD 播放器都是电子小工具。您可以使用常用方法,例如

public boolean turnOn()
public boolean turnOff()

在里面。

于 2013-05-25T07:10:14.837 回答
3

电视、家庭影院、CD 播放器显然不是遥控器。它们确实是可远程的。它给了我们一个提示,应该有接口Remotable并由设备实现。

interface Remotable {
    void turnOff();
    void turnOn();
    void volumeUp();
    void volumeDown();
    void selftDestruct();
}

然后我们让所有设备都实现这个接口。

class Television implements Remotable {

    @Override
    void turnOff() {
        System.out.println("Television is turned off");
    }

    //implements the rest.
}

class HomeTheater implements Remotable {
    // implements likes Television
}

class CDPlayer implements Remotable {
}

然后做了一个Remote类来处理Remotable设备。

class Remote  {
    private Remotable target;

    public Remote(Remotable target) {
        this.target = target;
    }

    public void turnOn() {
        target.turnOn();
    }
}

组装所有东西,我们有这样的东西:

Television tv = new Television();
Remote remote = new Remote(tv);
remote.turnOn();
于 2013-05-25T07:24:01.880 回答
2

旁边说的。您可能有一个名为 RemoteControl 的抽象类。在这个类中,您实现了常用方法。如果你想要一个电视遥控器,你可以实现一个名为 TvRemoteControl 的类,它扩展了 RemoteControl。这样你就说 TvRemoteControl Is-A RemoteControl。

在此之上,您可以将 RemoteControl 添加到 TV 对象。

这有意义吗?

于 2013-05-25T07:41:31.140 回答
1

据我了解,当您的意思是 Remote 是超类时,它适用于所有 Remote 类型(用于电视、CD 播放器等)

远程的行为从小工具到小工具的变化。可能是RemoteControl具有一组方法的接口。所有的实现类都会有自己的风格。

注意:我建议添加更有意义的类/接口名称。我不喜欢Remote它,因为它也可能意味着java.rmi.RemoteJDK

还有一件事:当你认为它可以被所有子类重用或者当他们做一个super.

class Super
{
   public void method1()
   {
   }
}

class Sub extends Super
{
   public void method1()
   {
      super.method1();
      //Add more behavior specific to Sub
   }
}
于 2013-05-25T07:16:05.937 回答
1

坦率地说,你没有抓住重点。

它是关于改变,而不是关于正确使用 OOP。您相信将来会添加更多设备吗?或者特定设备的功能会改变吗?

如果您正在为所有设备构建一个独特的遥控器,您将需要为这些设备配备不同类型的遥控器。每个设备可能/可能不会有超过 1 个遥控器。因此,您不能继承远程属性,而是需要实现该设备基本上需要的所需远程属性。遥控器本身将具有相互继承的树状结构。遥控器将继承 channelClicker、soundBasic、soundAdvanced、soundProfessional、videoChild 等功能。

现在,如果您正在构建一个通用遥控器,那么设备将发生变化,您需要在添加新设备时控制其他设备中的代码更改。因此,您需要在遥控器运行时抽象出设备类型。对于不同的设备,遥控器的行为会有所不同。有些设备遥控器会抛出“不支持”。虽然有些音量会每 upPress 增加 5db,而每 upPress 会增加一些 50db。对于每个设备,远程参数将不同。分贝单位,亮度单位。

你必须以不同的方式思考并为改变而设计。当您将来更改代码时,您不需要重新测试所有设备、所有遥控器,因为更改将仅针对该设备进行本地化。每个设备可以有不同的小型库,这样即使您重新构建并运行测试,也不需要运行任何较旧的测试,因为您没有更改任何代码。

设计模式需要使您的思想面向未来代码的最小更改。

编辑:而且,你有一个很好的问题。我建议你再读一遍前三章,多喝水。你很亲密。不要放弃,不要改变你的榜样,除非你得到它,否则不要屈服。相信我,你很亲密。

于 2013-05-25T07:58:58.283 回答