【问题标题】:How to inherit from class in interface?如何从接口中的类继承?
【发布时间】:2014-04-05 18:31:25
【问题描述】:

假设我在 BaseClass.h 中有类 BaseClass。 我想创建一个 SubClass 并从我的 BaseClass 继承,就这么简单。 但是我想在子类的接口中进行继承。

 // SubClass.h
//#import "BaseClass.h" -I dont want to make import to the header (Better convention - I think so).
//@class BaseClass; - That will work only for declaring an instance/property.

@interface SubClass : BaseClass{

 }

我还想将这两个类保存在单独的文件中。我是否有一个简单/优雅的解决方案,例如在 Xcode 项目中对我的类进行分组,以便它们能够相互识别。

【问题讨论】:

  • 你为什么不想做#import?这很简单。是的,您可以使用 .pch 文件,但它会产生奇怪的错误。
  • 不是我“不想”。我刚刚读到将所有导入文件放在 .m 文件中并在 .h 文件中使用 @class 更好(某种约定),但在这种情况下它不起作用。所以我想也许还有另一种选择?也可能不是。
  • 现在你被告知答案:“不是”。
  • 试试这个。在 Xcode 中,在您的项目中,创建一个新的 UIView 子类(选择 File > New,iOS > Cocoa Touch > Objective-C Class,类 MyView 的 UIView 子类。现在再次执行相同的操作,但这次将其设为 MyOtherView,即MyView 的子类。看看 OtherView.h。他们已经导入了 MyView.h!这正是你拒绝做的事情。请注意:如果你取出那个导入,项目将无法编译!
  • 但是,您可以将 UIKit 从 MyView 标头中导入,一切仍然有效。为什么?因为 .pch 文件导入UIKit,因此其他所有内容都隐式导入它。

标签: ios objective-c inheritance


【解决方案1】:
//#import "BaseClass.h"

取消注释该行。您必须导入超类的标头以使其成为它的子类。我不明白你反对这样做的原因是什么。

【讨论】:

  • 感谢马特,正如我在问题中所写,唯一的反对意见是避免声明循环,就我现在而言,在头文件中插入导入并不是“非常”正确的。
  • 除了重复我的回答,我不知道该说什么。不管你认为你知道什么,我所说的就是你必须做的。
  • 还要记住#import 不是#include。它可以防止循环。
  • 我真的不知道如何解释它但我以某种方式成功地为其他两个类(或者可能是某种 Xcode 错误)完成了它,我可以在另一个标题中看到我的类而无需导入它。
  • @Mike.R - 如果对类的唯一引用是声明一个指针变量或指针参数,那么(非常轻微地)只执行@class 而不是#import。它节省了极少的编译时间,并且在非常复杂的场景中,可以避免包含排序问题。但作为一般策略,这是不值得的。如果要声明类类型的实际变量(相对于指针)、引用类的方法或子类化类,则无法避免包含 .h。这适用于 C++ 和 Objective-C。
【解决方案2】:

你必须导入超类,否则你的子类没有关于构建什么的参考。在您的 subclass.h 中,您应该#import "BaseClass.h"。循环包含应该没有问题,因为#import 使用标头保护来解决这个问题。

【讨论】:

    【解决方案3】:

    xcode 项目中有一个文件,称为 .pch 文件。在此文件中,您可以导入头文件。在此之后也无需导入其他头文件。但请确保您导入的文件已在所有文件中使用。

    【讨论】:

    • 我认为 .pch 文件会将所有内容导入源而不是标题。
    • 这也是我在答案中提到的。
    猜你喜欢
    • 2019-12-22
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多