Objective C Delegate - 查找父类的名称

Posted

技术标签:

【中文标题】Objective C Delegate - 查找父类的名称【英文标题】:Objective C Delegate - Find name of parent Class 【发布时间】:2014-01-19 13:35:46 【问题描述】:

我正在编写 10 个单独的实用程序类,用于从服务器填充查找表,每个查找表一个实用程序类。

我注意到所有 10 个都非常相似,并且我相信我可以创建一个抽象类来完成 90% 的工作,并且可以在从子类实例化它时将参数传递给它。

问题在于,当超类想要引发一个委托事件时,无论它是在哪个子类中继承的,它都将具有相同的名称,因此任何拥有该子类的类或控制器都需要一种方法来识别超类正在触发哪个子类来自的代表。

有什么方法可以知道哪个子类拥有被解雇的委托的超类?

例如 我有一个名为“动物”的超类,它有一个代表事件“动物想要食物” 子类“狗”和“猫”都继承自“动物” 一个名为 'farmyard' 的 NSObject 实例化了 'dog' 和 'cat' 类,并使自己成为 'dog' 和 'cat' 的代表。 当 'dog' 继承的 'Animal' 实例触发 'Animal want food' 时,这将由 'farmyard' 对象接收。 - “农场”如何知道是“狗”还是“猫”触发了“动物想要食物”委托事件?

【问题讨论】:

但是怎么做呢?在农家院内我需要知道,这样我才能正确回应。在活动中,我需要喂狗或猫,我需要知道哪一个能够做到这一点。 【参考方案1】:

因为委托方法应该将对象作为参数传递:

- (void)animalWantsFood:(Animal *)animal

然后接收方可以查看animal

查看整个 Apple 代码中提供的委托方法,您将看到委托模式的相同实现。

【讨论】:

只是为了确保我理解你的答案:所以在这个例子中我可以检查动物对象,我可以看看它是“狗”还是“猫”类型? 是的,你可以检查类(isKindOfClass:),或者如果委托拥有原始对象,则使用isEqual: / containsObject: 超级骗子。谢谢。【参考方案2】:

你的描述是错误的——这就是你的问题出现的原因

作为狗的动物永远是类狗

见: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

【讨论】:

您的答案的问题是动物不会从狗继承,狗会从动物继承,因为狗是动物,但动物不一定是狗。如果您删除超类,则猫和狗的委托事件的名称仍然相同,并且知道哪个子类引发事件的问题仍然存在 超类是动物,子类是狗和猫——我的答案是好的 自我永远是狗或猫,而不是动物 但我们不是在质疑“self”,而是在质疑“farmyard”,“farmyard”怎么知道“动物需要喂养”来自“dog.AnimalNeedsFeeding”或“cat.AnimalNeedsFeeding” ? 我不明白你......你需要传递一些东西;)

以上是关于Objective C Delegate - 查找父类的名称的主要内容,如果未能解决你的问题,请参考以下文章

objective-c的delegate委托的用法

在 iOS 13 [UIApplication sharedApplication] delegate].window 中使用objective-c 不起作用

Objective C Protocol implementation

如何使用objective c实现苹果手表皇冠代表

在 WKInterface Table + Objective c 中重新加载数据

在Objective C中使用iBeacon查找距离