2

我有 2 个子类;从 Base 继承的 SubA 和 SubB。

子类具有相同的方法:SubMethodA。对于两个子类,此方法的编写方式完全相同。它的区别在于它的执行。在 SubMethodA 中,它调用 SubMethodB,根据子类执行不同的操作。

我想我可以将 SubMethodA 移动到 Base,但 Base 当然不知道 SubMethodB。

• 第一次尝试:我将SubMethodA 的原型和它的实现添加到Base 类。然后我将 SubMethodB 的原型添加到 Base 的接口中。在 Base 的实现中,我将 SubMethodB 实现为一个空存根。这将允许“通过”子类;子类将覆盖 SubMethodB。这行得通,但感觉有些不对劲。有一个空存根只是为了让它工作感觉不正确。不知道为什么,但我内心的程序员不高兴。

• 第二次尝试:我将 SubMethodB 原型留在了 Base 标头中。我删除了空存根,当然我得到了一个“不完整的实现”警告。编译和运行正确但不正确。

• 第三次尝试:我从 Base 标头中删除了原型。最后一个警告消失了,但我得到了一个新警告。“找不到实例方法'-SubMethodB:'(返回类型默认为'id')”。再次警告是有道理的,代码运行正常,但这是不正确的。

• 第四次尝试:我创建了一个名为“BaseProtocol”的@protocol,它由两个子类实现;子 A 和子 B。上次尝试时我仍然收到相同的警告。

• 第五次尝试:在最后的努力中,我用“[self conformsToProtocol:@protocol(BaseProtocol)]”包围了有问题的代码,以查看编译器是否会注意到我正在检查以确保该方法确实由子类并没有给我警告,但它没有任何区别。和上次一样的警告。

所以这是我的问题:

  • 这种基类调用子类方法的想法是白日梦,还是有一种方法可以在没有任何警告的情况下正确完成?
  • 我希望在基类中拥有与 2 个子类中完全相同的代码,我的思维模式是否不正确?

任何帮助、见解或建议将不胜感激。

4

2 回答 2

0

我会将 SubMethodA 放在 Base 类中。然后在每个子类中,重写 SubmethodA。在覆盖中,您将调用 [super SubMethodA],然后以您喜欢的任何方式添加您的 SubmethodB。

于 2012-06-26T20:38:57.093 回答
0

关于警告:

您可以在协议中使用可选方法。这将消除实施不完整的警告。

关于设计:

您尝试做的设计与 Objective-C 中的常见设计模式不同,继承是相当不寻常的。相反,委托通常用于自定义实现。如果方法和你说的一样相似,那么也许你可以为 delegateA 和 delegateB 找到一个地方来改变将会发生的事情。也许您的“基”类(在引号内,因为它不再有任何子类)可能有一个 API,其中 delegateA 和 delegateB 可以发送代码块以在 methodA 中的不同点执行

于 2012-06-26T20:35:32.817 回答