【问题标题】:Inheritence method call design issue继承方法调用设计问题
【发布时间】:2013-11-25 22:43:13
【问题描述】:

我在使用 Pharo 设计 OO 应用程序时有点吃力。

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

如果我想在我的模拟有线电视订阅中添加电视,我可以简单地在我的tvConnection 属性上调用addTV: aTelevision,然后它会正确调用我在Analog 类中实现的addTV: 方法。

数字连接不能连接电视。这些必须是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

这两种解决方案在我看来都非常肮脏。

【问题讨论】:

    标签: oop smalltalk pharo


    【解决方案1】:

    如果我是你,我可能会以数字方式实现 addTV:,这会将电视添加到盒子或说盒子丢失。

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

    TVSubscription>>addTV: aTV
      self subclassResponsibility
    
    TVSubscription>>tvs
      self subclassResponsibility
    

    Analog 具有 tvs 变量。

    Analog>>addTV: aTV
      tvs add: aTV
    
    Analog>>tvs
      ^ tvs
    

    Digital 具有 box 变量。

    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
    

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

    【讨论】:

    • 我想我会采用这种方法。这似乎很简单。我对这种可扩展性的唯一问题。我还必须实现Analog >> addSetTopBox 方法(以显示消息“无法将机顶盒添加到模拟连接”)。假设我实现了另一种类型的连接,比如Sattelite,它允许SatSetTopBox 设备具有 1 个或 0 个 TV 对象。这意味着我必须对所有对象实现 addSatSetTopBox 方法。这对我来说似乎不对?
    • 为什么需要区分这么多?创建一个方法addAdapter:。然后让类来决定他们是否可以使用这个适配器。你也可以减少限制。即允许连接任何适配器。但是,当一个适配器无法理解发送给另一个适配器的消息时,事情就会开始崩溃。我想说把东西放在更高的抽象层次上很好。所以你可以有适配器。然后每个订阅都应该知道它可以使用哪些适配器以及如何与他们交谈
    【解决方案2】:

    也许您应该重新考虑您的设计。在我看来,tvConnection 应该是一个连接对象,比如说TVConnectionTVConnection 可以有两个子类 DirectConnectionSetTopBoxConnectionDigitalAnalog 会知道他们的连接类型,并且连接类型知道如何 addTV: 或更方便地,DigitalAnalog 实现 addTV: 并简单地委托给他们的 TVConnection 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多