继承方法调用设计问题

时间:2013-11-25 22:43:13

标签: oop smalltalk pharo

使用Pharo设计OO应用程序时,我有点蠢。

我有一个班级Household,这个班级有一个名为tvConnection的属性。此对象是DigitalAnalog的实例。这两个类都继承自名为TVSubscription的超级。

如果我想在我的模拟有线电视订阅中添加电视,我只需在我的addTV: aTelevision媒体上拨打tvConnection即可,然后正确调用我在我的addTV:方法Analog课程。

数字连接无法连接电视。这些设备必须是SetTopBox设备,而这些设备又可以连接电视。

现在,我必须抛出一个错误/显示一些输出,以防用户试图将电视添加到有数字连接的家庭。

我想我可以做两件事:

1) 我可以在Digital类中实现addTV:方法,它只是执行所需的动作(例如,显示消息“你不能这样做!”)。但这在很多方面似乎都是错误的。

2) 我可以不实现该方法并捕获被抛出的MessageNotUnderstood错误。 当我执行以下操作时会发生这种情况:

**Adding a TV**
--> call `addTelevision` in `Household`
----> this `addTV:` on the `tvConnection` property
----> catch error if any, which implies that a TV was being added to a digital connection

这两个解决方案看起来真的很脏。

2 个答案:

答案 0 :(得分:2)

如果我是你,我可能会在数码中实现addTV:,这会将电视添加到一个盒子中,或者说该盒子丢失了。

这看起来很不错。想一想:

TVSubscription>>addTV: aTV
  self subclassResponsibility

TVSubscription>>tvs
  self subclassResponsibility

Analogtvs var。

Analog>>addTV: aTV
  tvs add: aTV

Analog>>tvs
  ^ tvs

Digitalbox var。

Digital>>box: aBox
  box := aBox

Digital>>box
  ^ box

Digital>>addTV: aTV
  box 
    ifNil: [ Exception signal: 'Connect box' ]
    ifNotNil: [ box addTV: aTV ]

Digital>>tvs
  ^ box tvs

这只是第一个最好的想法。现在我会去睡觉,也许我会梦想一些更好的解决方案

答案 1 :(得分:2)

也许你应该重新考虑你的设计。在我看来,tvConnection应该是一个连接对象,让我们说TVConnectionTVConnection可以有两个子类DirectConnectionSetTopBoxConnectionDigitalAnalog会知道他们的连接类型,连接类型知道如何addTV:或更方便,DigitalAnalog实施addTV:和只需委托他们的TVConnection对象。