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

Lio*_*Lio 12 methods private objective-c super categories

我正在阅读如何在Objective-C中实现私有方法(在Objective-C中为类定义私有方法的最佳方法)以及我脑海中浮现的一个问题:

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

假设我有一个MySuperClass,其中包含一个包含其所有私有方法的Category,我想实现一个MySubclass覆盖或调用super到其中一个MySuperClass私有方法.这是可能的(使用Categories方法实现私有方法)?

看一下这些代码,底部有覆盖方法.

// ===========================
// = 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
Run Code Online (Sandbox Code Playgroud)

希望有人已经想到这一点.

干杯!

nal*_*all 13

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

...明亮的一面是它允许你模拟受保护的方法.为此,必须以某种方式通知子类的编写器有关受保护的方法,并且他们需要忍受编译器警告.或者,您可以在单独的接口文件(例如,"PointProtected.h")中声明受保护的类别,并提供此接口文件,并了解它只应由子类的接口文件导入和使用.


NSR*_*der 13

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