12

我正在阅读如何在 Objective-C 中实现私有方法(在 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

希望有人已经弄清楚了。

干杯!

4

2 回答 2

13

这个 GNUStep 页面描述了第 4.5 节的一种方法:

...它的好处是它还允许您模拟受保护的方法。为此,必须以某种方式告知子类的编写者有关受保护方法的信息,并且他们将需要忍受编译器警告。或者,您可以在单独的接口文件(例如,“PointProtected.h”)中声明受保护的类别,并为该接口文件提供理解,即它只能由子类的接口文件导入和使用。

于 2009-10-17T16:55:24.597 回答
13

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

于 2009-10-17T22:37:57.750 回答