med*_*ick 3 iphone objective-c ios
我有两个类,Class1和Class2,第二个继承自第一个类.我需要覆盖Class1的-update方法来实现我的目标.继承方法中-update方法的更改是在代码中间执行的,所以我不能使用[super update].这就是为什么我需要将原始方法从父类复制粘贴到继承类.此方法使用父方法的私有方法,因此当我尝试覆盖时,我收到有关缺少私有方法的警告,因为Class2仅导入Class1.h.澄清一下,这是代码:
Class1.h:
@interface Class1 : NSObject
-(void) update;
@end
Run Code Online (Sandbox Code Playgroud)
Class1.m:
@interface Class1 (Private)
-(void) private1;
-(void) private2;
@end
@implementation Class1
-(void) update
{
[self private1];
[self private2];
}
-(void) private1
{
// some code
}
-(void) private2
{
// another code
}
@end
Run Code Online (Sandbox Code Playgroud)
Class2.h:
@interface Class2 : Class1
-(void) update;
@end
Run Code Online (Sandbox Code Playgroud)
Class2.m:
@implementation Class2
-(void) update
{
[self private1]; // warning here
// do my own stuff between private methods, that is the reason of inheritance
[self private2]; // warning too
}
@end
Run Code Online (Sandbox Code Playgroud)
此外,Class1不属于我的所有权,它是来自开源库(确切地说是Cocos3D),因此我无法更改它(这就是我继承的原因).
问题是:如何删除警告?我能看到的唯一解决方案是将私有方法的签名复制到Class2,但它似乎是一个肮脏的技巧.或者,如果有人指出不是如何删除警告,那将是完美的,但如何实现我更好地改变方法的目标.
无需调配,执行选择器:或任何其他运行时错误.
只需移动或复制这个:
@interface Class1 (Private)
-(void) private1;
-(void) private2;
@end
Run Code Online (Sandbox Code Playgroud)
到子类的.m文件的开头.
通常,当尝试实现像@protected方法的范围之类的东西时,这样的声明将在头文件中,Class1_Private.h并且该头将被设置为privateXcode中的角色.
正如其他人所指出的那样,通过这种机制暴露私有方法有点危险.鉴于Cocos2D是开源的,可以稍微减轻这种危险,或者您可以随时直接修改它.当然,这样做意味着您有效地拥有一个分支,维护成本很高.
如果这是其他开发人员可能会做的事情,我建议向Cocos2D提交一个错误,要求公开这些方法以进行子类化.
| 归档时间: |
|
| 查看次数: |
3444 次 |
| 最近记录: |