【问题标题】:Java OOP based Program Flow [closed]基于 Java OOP 的程序流程 [关闭]
【发布时间】:2013-05-20 18:45:46
【问题描述】:

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

  • Remote 是所有这 3 类电视、家庭影院、CD 的超类 播放器。
  • 开、关、音量+-、频道+-等基本功能在 超类这些被覆盖
  • 那些不常见的方法在接口中实现,例如 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 设计技术,谢谢

【问题讨论】:

  • 这意味着只是一个演示先生而不是原始遥控器......只是试着理解我将使用布尔值输入 on off .. +,- for volume .. 并且从 BufferedReader 等获取输入...不要考虑我为一些原始遥控器编码它必须在控制台上显示输入和输出..就是这样
  • 遥控器如何成为电视的超级类?电视是一种特殊的遥控器吗? :P
  • @Patashu 我确实忽略了 is-A 测试 ....那是我的错误
  • 我明白了,现实生活的抽象,太棒了。
  • 我觉得我说/打得很好

标签: java class oop inheritance polymorphism


【解决方案1】:

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

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

public Class TV implements Remote

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

public boolean turnOn()
public boolean turnOff()

在里面。

【讨论】:

  • 谢谢你真的有帮助
  • 还有一件事我可以在远程接口中实现所有常见的方法,而对于其他不常见的方法,我应该在这些类中定义这些方法还是为它们定义单独的接口?谢谢你
  • 这样不行。它也必须有意义。例如,如果您想维护您订阅的频道,那么 addChannel() 或 removeChannel() 之类的功能在远程接口中将没有意义..您将需要定义一个新接口,例如 CableConnection。现在,即使您想在计算机上观看频道,您也可以简单地说计算机实现 CableConnection。
  • 哦,谢谢你的帮助
  • 我会说“实现 RemoteControllable”或类似的东西,而不是“实现远程”,但这个想法是正确的
【解决方案2】:

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

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

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

还有一件事:当你认为它可以被所有子类重用或者当他们做super.时,更喜欢向你的超类添加代码

class Super
{
   public void method1()
   {
   }
}

class Sub extends Super
{
   public void method1()
   {
      super.method1();
      //Add more behavior specific to Sub
   }
}

【讨论】:

  • 你的解决方案是遥控器和电视都连接到局域网的“真正解决方案”,但他只是学习java基础..所以我认为这只是一个面向对象的例子
【解决方案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();

【讨论】:

  • 请解释一下 class Remote {} 这个类。谢谢
  • Remote 类只是远程。它只知道如何使用Remotable 对象,而不关心对象是TelevisionHomeTheaterCDPlayer
  • 这个思路清晰,
  • +1 这是正确答案
  • 所以我读了 3 遍,它的完美答案..
【解决方案4】:

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

除此之外,您还可以将 RemoteControl 添加到 TV 对象。

这有意义吗?

【讨论】:

  • yes "在此之上,您可以将 RemoteControl 添加到 TV 对象。" 这是什么意思?
  • 我的意思是,如果你有一个名为 TV 的类,你可以向它添加一个 RemoteControl 类型的属性。 public class TV implement Remotable {private RemoteControl remote = new TvRemoteControl();}
  • 这正是我的想法。它很干净。
【解决方案5】:

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

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

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

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

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

设计模式需要让您的思想在未来尽量减少代码变化。

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

【讨论】:

  • 谢谢你的先生,我肯定会先读 3 ch,因为我非常决心这样做:)
  • 一遍又一遍地阅读,如果你读到了前三章,你可以轻而易举地读完剩下的,相信我,你会明白的。不要放弃。
  • 确定我有硬拷贝,我现在就读这些。
猜你喜欢
  • 1970-01-01
  • 2016-01-17
  • 2012-06-26
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多