Nav*_*han 3 methods overriding objective-c
如何防止方法在子类中被覆盖,在?中缺少对其超类的实现的调用?
我知道[super methodName];有时会打电话来解决我的问题.
但是,如果其他人要使用我的父级并超越我的方法,不小心失去了打电话给超级,我该怎么办?
更多解释:
我创建了一个viewcontroller VC1,它有一个方法-(void)indexDidChange:(int)index { }.我在那里写了一些我需要每次都要执行的操作.我将这个名为SVC1的viewcontroller子类化,我需要-(void)indexDidChange:(int)index { }做一些其他操作,但同时VC1 -(void)indexDidChange:(int)index { }动作也需要执行.所以我需要打电话,
-(void)indexDidChange:(int)index {
[super indexDidChange:index];
}
Run Code Online (Sandbox Code Playgroud)
所以我决定改变VC1的功能,比如
-(void)indexDidChange:(int)index {
[self currentIndexDidChange:(int)index];
}
-(void)currentIndexDidChange:(int)index { }
Run Code Online (Sandbox Code Playgroud)
我需要 - (void)currentIndexDidChange:(int)index {}来覆盖和阻止 - (void)indexDidChange:(int)index {}来覆盖.
可能吗?
编辑:在OP重新提出问题后,很明显OP实际上并没有寻找最终方法,尽管问题是初步措辞,这暗示了这一点.
根据你的重新提出的问题,你不是要保护一个方法根本不被覆盖,而是担心你的一个子类覆盖一个方法而且意外地缺少在新实现中包含对super的调用.
然而,这是一个相当普遍和普遍存在的问题,而且你每天都要处理这个问题,而不必过多关注它.
每个Objective-C程序员都熟悉以下方法,对吧?
- (void)dealloc {
[iVar release], iVar = nil;
[super dealloc]; //skipping this call to super is fatal!
}
Run Code Online (Sandbox Code Playgroud)
我们知道跳过这些[super dealloc];让事情变得不舒服.(如果dealloc缺少对super的调用,那么clang编译器会发出警告,...非常方便.)
尽管这种方法的严重压倒可能会产生致命的后果,但Apple并没有选择在此处设置任何类型的安全系统.
相反,Apple做到了这一点(与需要调用super的任何其他方法一样):
请记住,这- (void)dealloc绝不是例外.Cocoa中有几十种这种类型的方法.(- (id)init仅举几例KVO观测方法的衍生物等等,仅举几例.)
所以你应该做的是:
super,告诉读者/ dev在查询规则时查找文档.(可选的)您要求的是相当于最终函数,如Java或C++所知.与Java或C++不同,Objective-C 中没有最终方法.
根据您的情况,有一些解决方案可能会使您至少接近您的目标.你所能得到的只是稍微好一点的分离.您不会从中获得任何重要的安全性.在Objective-C中,您甚至无法确定方法的来源.方法调配允许您随意交换方法.使用代码注入,您甚至可以在运行时将代码注入进程.所有这些都是Objective-C的设计.Objective-C允许您锯掉您所坐的分支.因此,它要求你像成年人一样行事.因此,也没有私人方法.如果一个方法宣称私有,那么你作为开发人员应该相应地行事.
现在可能的" 解决方案 ":
如果只是你的超级类,如果应该调用给定的(最终)方法:
但是,如果要求子类调用给定(最终)方法:
NSArray,NSDictionary,NSSet班做到这一点)但是你可能会注意到,由于Objective-C缺乏保护,通常只能在两者之间做出选择:开放性,保护性,而不是混合它们.
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |