我正在学习基本的java,阅读Head First Java的基本概念(Polymorphisim,抽象类/方法,覆盖等),现在我正在做一个非常简单的例子,其中Remote用于电视,家庭影院和Cd播放器。一个遥控器必须完美地适用于所有3个设备。我现在所做的是......
那些不常见的方法在接口中实现 弹出,插入,用于Cd播放器,显示电视和电视的设置 剧院等。
这种做法好吗?
将一个类作为超类并实现其余的代码 接口。
另一点,if one method is common in Tv and theater like Display settings should i implement interface or change my class hierarchy .
。
请不要介意它的愚蠢问题,并指导我关于这些oop设计技巧,谢谢
答案 0 :(得分:7)
在实现继承(SuperClass-SubClass逻辑)之前,请始终执行 Is-A 测试。电视是遥控器吗?不......那你的做法是错的。据我说它必须是一个界面。电视必须实现不扩展远程。只要您拥有通用代码,就不会使用继承来避免重复。
on,off,volume + - ,channel +等基本功能必须在Remote Interface中,所有其他Classes TV都必须实现它们。
public Class TV implements Remote
此外,如果您想使用继承,您可以使用像 ElectronicGadget 这样的SupeClass。你所有的电视,家庭影院,Cd播放器都是电子小工具。你可以使用像
这样的常用方法public boolean turnOn()
public boolean turnOff()
在其中。
答案 1 :(得分:3)
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();
答案 2 :(得分:2)
接下来说了些什么。您可能有一个名为RemoteControl的抽象类。在本课程中,您将实现常用方法。如果你想要一个电视遥控器,你实现了一个名为TvRemoteControl的类,它扩展了RemoteControl。这样你就是说TvRemoteControl是一个远程控制。
除此之外,您还可以将RemoteControl添加到电视对象中。
这有意义吗?
答案 3 :(得分:1)
据我所知,当你的意思是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
}
}
答案 4 :(得分:1)
坦率地说,你错过了这一点。
它的变化,而不是正确使用OOP。您是否相信将来会添加更多设备?或者是特定设备的功能会发生变化吗?
如果要为所有设备构建独特的遥控器,则需要为这些设备使用不同类型的遥控器。并且每个设备可能/可能不具有多于1个遥控器。因此,您无法继承远程属性,而是需要实现该设备基本需要的所需远程属性。远程本身将具有彼此继承的树状结构。遥控器将继承诸如channelClicker,soundBasic,soundAdvanced,soundProfessional,videoChild等功能。
现在,如果您要构建通用遥控器,那么设备将会发生变化,您需要在添加新设备时控制其他设备中的代码更改。因此,您需要在远程功能正常时抽象出设备类型。对于不同的设备,遥控器的行为会有所不同。遥控器会弹出一些“不支持”的设备。虽然有些卷的每个upPress会增加5db,而每个upPress会增加50db。对于每个设备,远程参数将不同。分贝单位,亮度单位。
您必须以不同的方式思考并设计更改。在您将来更改代码时,您不需要重新测试所有设备,所有遥控器,因为更改将仅针对该设备进行本地化。每个设备可以有不同的小型库,即使您重建并运行测试,也不需要运行旧的测试,因为您没有更改任何代码。
设计模式需要让您的思想面向未来代码的最小变化。
编辑: 而且,你有一个很好的问题。我建议你再读一下前三章,多喝水。你很近。不要放弃,不要改变你的榜样,不要放弃,除非你得到它。相信我,你非常接近。