使用Pharo设计OO应用程序时,我有点蠢。
我有一个班级Household
,这个班级有一个名为tvConnection
的属性。此对象是Digital
或Analog
的实例。这两个类都继承自名为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
这两个解决方案看起来真的很脏。
答案 0 :(得分:2)
如果我是你,我可能会在数码中实现addTV:
,这会将电视添加到一个盒子中,或者说该盒子丢失了。
这看起来很不错。想一想:
TVSubscription>>addTV: aTV
self subclassResponsibility
TVSubscription>>tvs
self subclassResponsibility
Analog
有tvs
var。
Analog>>addTV: aTV
tvs add: aTV
Analog>>tvs
^ tvs
Digital
有box
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
应该是一个连接对象,让我们说TVConnection
。 TVConnection
可以有两个子类DirectConnection
和SetTopBoxConnection
。 Digital
和Analog
会知道他们的连接类型,连接类型知道如何addTV:
或更方便,Digital
和Analog
实施addTV:
和只需委托他们的TVConnection
对象。