在 Objective-C 中使用类别的私有方法:从子类调用 super

Posted

技术标签:

【中文标题】在 Objective-C 中使用类别的私有方法:从子类调用 super【英文标题】:Private methods using Categories in Objective-C: calling super from a subclass 【发布时间】:2010-12-07 15:26:11 【问题描述】:

我正在阅读如何在 Objective-C (Best way to define private methods for a class in Objective-C) 中实现私有方法,然后我想到了一个问题:

您如何设法实现受保护的方法,即子类可见的私有方法?

假设我有一个 MySuperClass,其 Category 包含它的所有私有方法,并且我想实现一个 MySubclass 覆盖或调用超级 MySuperClass 私有方法之一。这可能吗(使用类别方法来实现私有方法)?

看一下这段代码,底部有被覆盖的方法。

// ===========================
// = File: MySuperClass.h
// = Interface for MySuperClass
// ===========================

@interface MySuperClass : Object
...
@end

// ===========================
// = File: MySuperClass.m
// ===========================
#import "MySuperClass.h"

// =================================
// = Interface for Private methods
// =================================
@interface MySuperClass (Private)

-(void) privateInstanceMethod; 

@end

// =====================================
// = Implementation of Private methods
// =====================================
@implementation MySuperClass (Private)

-(void) privateInstanceMethod

  //Do something


@end

// ================================
// = Implementation for MySuperClass
// ================================
@implementation MySuperClass
... 
@end




// ===========================
// = File: MySubClass.h
// = Interface for MySubClass
// ===========================

@interface MySubClass : MySuperClass
...
@end


// ================================
// = Implementation for MySubClass
// ================================

#import MySubClass.h

@implementation MySubClass
//OVERRIDING a Super Private method.
-(void) privateInstanceMethod

  [super privateInstanceMethod]; //Compiler error, privateInstanceMethod not visible!
  //Do something else

@end

希望有人已经弄清楚了。

干杯!

【问题讨论】:

“幸好有人已经知道了。”...那你在问什么? 我认为是语言混乱。固定。 感谢您让我的问题更容易让大家理解。当我实际上的意思是“希望”时,我用“幸运”这个词犯了一个错误。非常抱歉,非常感谢! 【参考方案1】:

在 Apple,当他们构建框架时,典型的模式是有一个公共头文件 (MyClass.h) 和一个私有头文件 (MyClass_private.h),并且只将公共头文件复制到构建产品中。 .m 文件当然会#import 两者。

【讨论】:

【参考方案2】:

This GNUStep page 第 4.5 节描述了一种方法:

...这是好的一面 允许您模拟受保护的 方法也是如此。为此,作者 必须在某些情况下通知子类的 关于受保护方法的方式,以及 他们需要忍受 编译器警告。或者,你 可以声明受保护的类别 在单独的接口文件中(例如, “PointProtected.h”),并提供这个 接口文件与理解 它应该只被导入并且 由子类的接口文件使用。

【讨论】:

我就是这样做的。只需将方法声明放在类别标题中,但在主实现块中实现它们。那么需要了解该方法的文件只需#import标头即可。

以上是关于在 Objective-C 中使用类别的私有方法:从子类调用 super的主要内容,如果未能解决你的问题,请参考以下文章

数据隐藏和 Objective-C 合成器 [重复]

将受保护的 Objective-C 实例变量公开给子类

在 Swift 中使用 Objective-C 类别的正确方法是啥?

让 Objective-C 类看起来很漂亮

在 Objective-C 中定义私有变量的最佳方法

如何在 Swift 中调用 Objective-C 类别方法