【问题标题】:2 different implementations for 1 interface (.h file)1 个接口的 2 种不同实现(.h 文件)
【发布时间】:2014-06-18 09:47:15
【问题描述】:

我有一个baseClass1.h 和一个baseClass1.m

它们有几个公共方法,供几个基类使用。我想要做的是创建相同方法声明的不同实现。

在我写了baseClass2.m 之后,它的接口也是baseClass1.h。

现在在子类中,我如何让方法执行我在 baseClass2.m 中定义的操作,而不是在 baseClass1.m 中分别定义的方法

编辑:

我将 baseClass1 工作区中的目标复制到一个新目标。两个实现文件都专属于 2 个目标。我正在尝试做的是使用不同的 .m 文件与 xCode 中的每个目标选择。

这有点像更改 AP 定义。探索现在放弃 baseClass1.m 的可能性。任何方式,即使我删除 baseClass1.m 并且程序仍然应该构建

【问题讨论】:

  • 你是说你想要一个类,在同一个程序中,每个同名方法有两个版本?
  • 顺便说一句,根据 Cocoa 命名约定,类名应始终以大写字母开头,而方法、变量和属性的名称通常以小写字母开头。
  • BaseClass1BaseClass2是什么关系?一个是另一个的子类吗?或者他们只是碰巧共享一些通用接口?也许你可以减少抽象,给我们举例说明这两个基类是什么以及一些预期的子类是什么。
  • @PaulGriffiths ..是的。当我们想尝试一些新功能但又想保留旧功能时,就需要它。我理解授权将是一个很好的方式来做到这一点,但我只是在探索可以用目标做什么。我也在用简短的目标信息编辑我的答案。
  • @CalZone:所以你想要两个不同目标中同一个类的两个不同实现?

标签: objective-c


【解决方案1】:

如果你想在两个不同的目标中实现同一个类的两个不同的实现,那么你可以简单地为同一个类使用两个单独的实现文件,并将它们中的每一个都添加到一个目标中,例如

  • “BaseClass.h”:接口,
  • “BaseClassA.m”:BaseClass 的实现,仅在目标 A 中,
  • “BaseClassB.m”:BaseClass 的实现,仅在目标 B 中。

实现文件不必与类同名,这只是一个(有用的)约定。

【讨论】:

  • 如何告诉子类使用哪个目标和实现?子类仅使用#import baseclass.h 在我的情况下,子类实际上是在同一项目中的单独工作区中。
  • @CalZone:子类不需要知道在运行时使用哪个实现。您只需确保将“BaseClassA.m”或“BaseClassB.m”编译到目标应用程序中。
  • 在侧边栏中有一个 Target Membership 部分。您只在目标中包含 .m 文件;只需确保为每个 BaseClassA/BaseClassB 检查了正确的目标。
【解决方案2】:

您需要为公共接口创建@protocol。 在 baseClass1 和 baseClass2 中实现它的方法。 然后你可以继承任何你想要的基类。

【讨论】:

    【解决方案3】:

    您可以使用协议来声明通用接口。

    baseProtocol.h:

    @protocol your_protocol <NSObject>
    @optional
    - (void)methodA;
    @required
    - (void)methodB;
    @end
    

    baseClass1.h:

    #import "baseProtocol.h"        
    @interface baseClass1 : NSObject<your_protocol>
    @end
    

    baseClass2.h:

    #import "baseProtocol.h"
    @interface baseClass2 : NSObject<your_protocol>
    @end
    

    【讨论】:

    • 谢谢@Avt。我可以使用委托,但我主要是想了解 .h 和 .m 文件如何相互交互。您的链接实际上非常有用。
    【解决方案4】:

    从技术上讲这是可能的:实际上很容易。

    这也是个坏主意™。

    为什么这是个坏主意?因为出乎意料。这是非常出乎意料的。太出乎意料了,以至于有些人认为不可能,更多人甚至不明白你在哪里问。

    通过使用这种反模式,你注定未来的开发人员会浪费数小时试图弄清楚你做了什么,以及为什么这样做。

    在这个例子中,只使用一个协议,通过使用一个集群类来伪装它,或者只在一个类中支持这两种实现,使用一个标志在两者之间切换。不要仅仅因为你可以很聪明地使用构建系统,就让每个人都变得更难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多