【问题标题】:iPhone Objective-C foreach designiPhone Objective-C foreach 设计
【发布时间】:2014-10-02 07:28:26
【问题描述】:

我正在尝试实现如下设计:

Touch 类:充当接口,多个类继承自它:
MoveTouch
JumpTouch
InterfaceTouch

然后我想要一个Touch 对象的列表。然后,我希望能够仅从这个大列表中删除所有 MoveTouch 对象(而不是其他对象),然后分别删除所有 JumpTouch 对象等。不幸的是,for (MoveTouch* t in touches) 没有做我想做的事;整个列表中的所有内容都会被执行。

【问题讨论】:

    标签: iphone objective-c foreach


    【解决方案1】:

    你需要测试类类型:

    for (Touch *t in touches) {
      if ([t isKindOfClass:[MoveTouch class]]) {
        MoveTouch *mt = (MoveTouch *)t;
        // do what you want with mt
      }
    }
    

    【讨论】:

      【解决方案2】:

      我不是 Objective C 程序员。

      在您的情况下,我认为您需要使用“for (Touch* in touches)”浏览您的列表,并在正文中确定该对象是 MoveTouch 还是 JumpTouch 等等。

      但是多态的想法是你不这样做。你不会在你的循环中整理出来。您要执行的操作应在接口中定义,并且每个后代类为该操作实现不同的实现。这就是多态性的全部意义所在。

      【讨论】:

      • ... 这意味着您将执行诸如调用 [t update] 之类的操作,然后每个项目将决定在更新周期中要做什么。但这不是普遍的。很多时候,您有一条消息要发送给一个班级,而不是另一个班级。
      • 不是通用的,但在我看来确实有异味。尤其是当您表示自己也在设计类时。
      • 我实际上并没有对此进行多态性。我的基本需求是找到一种区分不同类型触摸的方法。触摸类型(移动、跳转、界面等)可以在创建时立即决定,这发生在“touchesBegan”中。从那时起,分离当你移动那个触摸或结束那个触摸等时发生的事情的功能要容易得多。我想也许继承对此有点花哨?也许只是一个简单的枚举就可以了?
      • 为什么是的,如果你不想要多态性,那么继承就有点矫枉过正了。一个简单的枚举可以避免整个运行时类型检查,这可能效率要低得多。
      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2013-11-26
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多