我如何防止方法被错误地覆盖

| 如何防止方法在子类中被重写,而导致在其中未调用其超类的实现? 我知道打“ 0”有时会解决我的问题。 但是,如果有人使用我的父类并覆盖了我的方法,而又意外地丢失了调用super的方法,那我该怎么办? 一些更多的解释: 我创建一个具有方法
-(void)indexDidChange:(int)index { }
的viewcontroller VC1。我在那里写一些我需要每次执行的动作。我将这个名为SVC1的viewcontroller子类化,在其中我需要
-(void)indexDidChange:(int)index { }
来执行其他一些操作,但同时也需要执行VC1
-(void)indexDidChange:(int)index { }
动作。所以我需要打个电话
 -(void)indexDidChange:(int)index { 
[super indexDidChange:index];
}
所以我决定更改VC1函数,例如
  -(void)indexDidChange:(int)index {
     [self currentIndexDidChange:(int)index];
 }

-(void)currentIndexDidChange:(int)index { }
而且我需要-(void)currentIndexDidChange:(int)index {}来覆盖和防止-(void)indexDidChange:(int)index {}被覆盖。 可能吗?     
已邀请:
编辑:OP改写了这个问题之后,很明显OP并没有在寻找最终的方法,尽管最初的措辞暗示了这一点。 OP(关于方法超越安全性)问题的新(更新)答案: 根据您改写的问题,您并不是要根本避免保护方法,而是要担心您的一个子类会覆盖方法,而无意中错过了在新实现中包含对super的调用。 但是,这是一个相当普遍且普遍存在的问题,您每天都在处理它,而无需对其进行过多关注。 每个Objective-C程序员都熟悉以下方法,对吗?
- (void)dealloc {
    [iVar release], iVar = nil;
    [super dealloc]; //skipping this call to super is fatal!
}
而且我们都知道跳过ѭ7会使事情变得不舒服。 (如果dealloc缺少对super的调用,则clang编译器afaik会发出警告,…非常方便。) 尽管错误地重写此方法可能导致致命的后果,但Apple并未选择在此处部署任何类型的安全系统。 相反,Apple做到了这一点(与其他任何需要调用super的方法一样): 在方法的文档中添加注释:   在执行特定于课程的课程之后   释放,子类方法   应该包含超类版本   通过消息解除分配给   超 希望您(程序员)成为一个成年人,并对您的工作负责。并遵守规则(由文档定义)。 请记住,
- (void)dealloc
绝不是例外。可可中有数十种此类方法。 (仅使用ѭ9的任何派生词,大多数KVO观测方法等,仅举几例。) 因此,您应该做的是: 为您写一个好的文档 方法。 (实际上,对您的整个项目而言更好) 在方法的文档中添加一个大声的注释,说明其规则。 在调用ѭ10method的行的正上方,为每个子类的重写方法实现添加注释,以告知读者/开发人员在对规则有疑问时查找文档。 (可选的) 负责任地编码。否则,您不应该首先进行编码。最终将是您的客户受苦。 归档伪最终方法的旧答案(预措词): 您需要的是与Java或C ++中已知的最终功能等效的功能。 与Java或C ++不同,但是Objective-C中没有最终方法。 根据您的情况,有一些解决方案可能使您至少接近目标。您所得到的只是更好的分离。您不会从他们那里获得任何重要的安全性。在Objective-C中,您甚至无法确定方法的起源。方法混乱让您可以随意交换方法。使用代码注入,您甚至可以在运行时将代码注入到进程中。所有这些都是由Objective-C设计的。使用Objective-C,您可以看到自己所在的分支。因此,它要求您表现得像个成年人。因此,也没有私有方法。如果某个方法被宣布为私有,则您作为开发人员应采取相应的行动。 现在到可能的“解决方案”: 如果仅是您的超类应该仍然调用给定的(最终)方法: 然后,Macmade的使您的方法成为伪私有方法的解决方案将非常有效。但是,隐藏方法声明的缺点是,从子类中调用隐藏方法会给您一个编译器警告,基本上可以防止您(sic!)*调用它。 (但是,它不会阻止您调用该方法。它只会通过引发编译器警告来避免这样做。) 但是,如果希望子类调用给定的(最终)方法: 使用委托模式,这样只能将允许重写的那些方法公开。 要完全避免覆盖,您可以使用类集群和抽象工厂模式,这会隐藏您的实现类,从而完全防止覆盖。 (Apple的
NSArray
NSDictionary
NSSet
班级都这样做) 但是,您可能会注意到,由于缺乏Objective-C的保护,通常只能在两者之间进行选择:开放性,受保护性,而不是将它们混合在一起。     
您可以在实现中使用类别,因此您的方法不会显示在头文件中。
MyClass.m
@interface MyClass( Private )

- ( void )myMethod;

@end

@implementation MyClass( Private )

- ( void )myMethod
{}

@end

@implementation MyClass

/* ... */

@end
    
我想,如果您未在\ .h文件中声明函数,则该函数未列出。     

要回复问题请先登录注册