Objective-c中的复杂层次问题

时间:2011-09-06 13:36:13

标签: objective-c oop

我不知道它是否像我说的那么复杂:P

这是用例:我有一个包含很多目标的项目,并且都使用相同的公共代码,但我创建了子类来使用特定的东西。这是面向对象的精神。

我在程序中有这个层次结构

NSObject -> ClassA_level_1 -> ClassA_level_2
NSObject -> ClassB_level_1 -> ClassB_level_2

ClassB_level_1 有一个变量ClassA_level_1 *classA,因此level1中的调用函数没问题。问题是ClassB_level_1必须在某些委托函数中调用 ClassA_level_2 (非级别1)中的内容。

如果在level_2中我可以调用超级来获取level_1中的内容,我该怎么办?有些棘手吗?

1 个答案:

答案 0 :(得分:2)

遇到此问题时,您很可能违反了Liskov's Substitution Principle。在OOP中,正方形不是矩形。

如果您没有违反LSP,那么ClassB_level_1仍然不应该在ClassA_level_2中调用任何内容。 ClassB_level_2应该是实现特殊逻辑的地方,因此它应该知道其委托的类,并且能够断言该类是正确的然后转换为它。也就是说,如果你发现自己在这里,通常是因为一个更基本的架构问题。

首先,在协议而不是类中重新考虑您的问题。你真的需要从这个其他对象中获得什么功能?使用协议和respondsToSelector:检查它,而不是通过断言某个类。

ClassB可以成为ClassA的工厂,以便始终创建正确的帮助对象吗?也许你应该重新考虑这个Class Cluster。当您发现自己创建复杂的并行层次结构时,通常需要提取Design Patterns并重新考虑您的体系结构。特别是,Decorator通常可用于导致大型并行树的问题。

但是如果你的设计是正确的,你只需要使用respondsToSelector:来确保你的委托在调用它之前响应你想要的方法。