我有2个子类;从Base继承的SubA和SubB。
子类具有相同的方法:SubMethodA。对于两个子类,此方法的编写方式完全相同。它的差异在于它的执行。在SubMethodA中,它调用SubMethodB,它根据子类的不同而执行。
我想我可以将SubMethodA移动到Base但当然Base不知道SubMethodB。
•首先尝试: 我添加了SubMethodA的原型,并将其实现添加到Base类。然后我在Base的接口中添加了SubMethodB的原型。在Base的实现中,我将SubMethodB实现为空存根。这将允许“传递”到子类;子类将覆盖SubMethodB。这有效,但有些事情是错误的。有一个空的存根只是为了让它工作,感觉不正确。不知道为什么,但我内心的程序员不高兴。
•第二次尝试: 我将SubMethodB原型留在Base标头中。我删除了空存根,当然我得到了一个“不完整的实现”警告。编译并正确运行但不正确。
•第三次尝试: 我从Base标头中删除了原型。最后一个警告消失了,但我得到了一个新警告。 “实例方法'-SubMethodB:'未找到(返回类型默认为'id')”。警告再次有意义并且代码正常运行但这不正确。
•第四次尝试: 我做了一个名为“BaseProtocol”的@protocol,它由两个子类实现; SubA和SubB。我上次尝试时仍然有同样的警告。
•第五次尝试: 在最后的努力中,我用“[self conformsToProtocol:@protocol(BaseProtocol)]”包围了有问题的代码,以查看编译器是否会注意到我正在检查以确保该方法是由子类实际实现的而不是给出我是一个警告,但没有区别。与上次相同的警告。
所以这是我的问题:
非常感谢任何帮助,见解或建议。
答案 0 :(得分:0)
您可以在协议中使用可选方法。这将删除不完整实施的警告。
您尝试做的设计与Objective-C中的常见设计模式不同,继承是相当不寻常的。相反,委托通常用于自定义实现。如果方法与您说的类似,那么您可以找到delegateA和delegateB的位置来改变将要发生的事情。也许你的“基类”(在引号内,因为它不再有任何子类)可能有一个API,其中delegateA和delegateB可以发送代码块在methodA中的不同点执行
答案 1 :(得分:0)
我会将SubMethodA放在Base类中。然后在每个子类中,重写SubmethodA。在覆盖中,您可以调用[super SubMethodA],然后以您喜欢的方式添加SubmethodB。