基类有没有办法在不污染 .h 文件的情况下声明受保护的变量?

Posted

技术标签:

【中文标题】基类有没有办法在不污染 .h 文件的情况下声明受保护的变量?【英文标题】:is there a way for a baseClass to declare protected vars without polluting .h file? 【发布时间】:2013-04-24 03:15:30 【问题描述】:

我发现很难相信没有straightforward 方法可以让类在 .m 文件中声明其受保护的属性(以避免使用只有子类需要知道的变量污染 .h 文件)..

用代码表示,我想完成这样的事情:

// SuperClass.h
NOTHING!

// SuperClass.m
@interface SuperClass
@property (nonatomic, retain) variable;
@end

// SubClass.m
// do something with variable

更新:这种情况发生在 UIGestureRecognizer.. 见subclassing notes:

你可以创建一个 UIGestureRecognizer 的子类来识别 独特的手势——例如,“复选标记”手势。如果你是 要创建这样一个具体的手势识别器,一定要导入 UIGestureRecognizerSubclass.h 头文件。此标头声明 子类必须覆盖、调用的所有方法和属性, 或重置。

来自Carl Veazey:基本上这个想法是子类应该知道的所有属性/方法都封装在一个单独的.h文件中。我想这会以不同的方式解决污染问题。

【问题讨论】:

您的派生类究竟如何知道m 文件中的内容? .h.m 文件的整个想法是提供一个定义,然后提供一个隐藏的实现 我想我明白你在说什么......所以假设 x 公司正在销售一段代码,他们只显示 .h 文件并隐藏其他所有内容......这段代码的消费者会必须知道他们可以继承哪些变量/方法.. @Moo-Juice 请查看问题更新 我真的不明白为什么您将头文件中的受保护/公共定义视为污染。对于 C、Objective-C 和 C++ 来说就是这样。是的,第 3 方库(您没有获得源代码的地方)通常是一个 dll/.so(已编译)以及头文件。 也许你是对的。我只是有点沮丧,现在我正在尝试构建我的代码以便它可以很容易地被子类化,我发现了很多关于如何做到这一点的意见/方法。例如,查看 Apple 使用 UIGestureReognizer 的方式(在我上面的更新中)..PSPDFKit,一个著名的 PDF 库使用另一个 way.. 我希望找到一种标准/明显的方法来做到这一点。但话又说回来,也许我应该停止抱怨并开始编码:) 【参考方案1】:

您可以在 .m 类中实现类别。

【讨论】:

不够好......如果没有一些可怕的解决方法,您无法将实例变量保存在类别中 horrific work arounds 我的意思是associative reference

以上是关于基类有没有办法在不污染 .h 文件的情况下声明受保护的变量?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不应用存储库基类的情况下使用存储库?

有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 转换为基指针?

有没有办法在不覆盖现有类名的情况下将类名添加到 blazor 组件?

如何在不包含 Windows.h 的情况下获得 DebugBreak 的声明?

有没有办法在不读取整个文件的情况下推断文件是啥图像格式?

有没有办法在不读取整个文件的情况下推断文件是啥图像格式?