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