从父母发送消息给孩子

Posted

技术标签:

【中文标题】从父母发送消息给孩子【英文标题】:Sending message to child from parent 【发布时间】:2010-07-28 10:25:08 【问题描述】:

我的 Child 类继承自 Parent 类。我想要的是向孩子发送消息,它具有该消息的实现。所以这就像从父级调用纯虚函数一样。如果我现在从家长那里发送消息,我会收到警告,家长可能不会回复此消息。这是真的,因为只有 Child 有它的实现。

基本上,父母会检测到一些动作,例如点击取消按钮,但每个孩子都有自己的取消消息实现,所以我想从父母onCancel 打电话让他们完成他们的工作。

不敢相信使用继承我仍然必须使用委托......

【问题讨论】:

【参考方案1】:

在运行时检查方法是否存在。因此,即使编译器警告您,代码仍然可以成功。但请务必先检查 self 是否真的定义了该方法。

if ([self respondsToSelector:@selector(onCancel)]) 
  [self onCancel];

如果要消除警告,请使用-performSelector:

if ([self respondsToSelector:@selector(onCancel)]) 
  [self performSelector:@selector(onCancel)];

【讨论】:

您可以通过将 self 转换为类型 id 来消除警告,这将比使用 performSelector 稍微快一点:【参考方案2】:

除非是不了解您的问题的人。 如果父母和孩子都实现了一些onCancel代码,为什么不在孩子onCancel内部调用[super onCancel],这将在孩子的代码执行之前执行。

【讨论】:

【参考方案3】:

继承并没有消除委派的需要。这些是 OOP 的相互排斥的方面。在我看来,您确实在尝试实施委托人。它委托给的类不应该是它的子类,而是离散类。这里需要的是组合,而不是继承。

【讨论】:

以上是关于从父母发送消息给孩子的主要内容,如果未能解决你的问题,请参考以下文章

命名管道和分叉令人头疼

从父母向孩子发送信号,反之亦然

Linux - 从管道读取的孩子接收发送到标准输出的调试消息

从主管重新启动后向参与者发送消息

带子进程的双向管道

冲突的 Android 错误消息:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()