gpt4 book ai didi

objective-c - 如何防止方法被错误覆盖

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:56 24 4
gpt4 key购买 nike

如何防止在子类中重写方法,缺少对其超类“实现”的调用?是的。
我知道有时候打电话会解决我的问题。
但是如果有人使用了我的父类并重写了我的方法,意外地错过了调用super,我该怎么办?
还有一些解释:
我创建了一个视图控制器VC1,它有一个方法[super methodName];。我写了一些我需要每次执行的动作。我把这个VIEW子控制器命名为Svc1,在其中我需要-(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!
}

我们都知道跳过 [super dealloc];会让事情变得不舒服。(afaik如果dealloc缺少对super的调用,clang编译器会发出警告,…非常方便。)
尽管这种方法的错误重写可能会产生致命的后果,但苹果并没有选择在这里安装任何类型的安全系统。
相反,苹果做到了这一点(就像其他需要调用super的方法一样):
在方法的文档中添加注释:
After performing the class-specific deallocation, the subclass method should incorporate superclass versions of dealloc through a message to super
希望你,程序员,成为一个成年人,对你的工作负责。以及遵守规则(由文档定义)。
请记住, - (void)dealloc绝不是例外。可可中有几十种这种方法。(仅取 - (id)init的任何导数、大多数kvo观测方法等,仅举几个例子。)
所以你应该做的是:
为您的
方法。(实际上,对你的整个项目更好)
在方法的文档中添加一个响亮的注释,解释其规则。
在调用 super的行的正上方,为每个子类的重写方法实现添加一个注释,告诉读取器/dev在对规则有疑问时查找文档。(可选)
负责地编码。否则,您不应该首先编写代码。最终,你的客户会因此受苦。
关于归档伪final方法的旧(预改写)答案:
您所要求的是一个等价于final函数的函数,如java或c++中所知。
与java或c++不同,objective-c中没有final方法。
根据你的情况,有些解决方案可能会让你至少接近你的目标。你所能得到的只是更好的分离。你不会从他们那里得到任何重要的安全。在objective-c中,您甚至不能确定方法的来源。方法swizzing允许您随意交换方法。使用代码注入,您甚至可以在运行时将代码注入进程。所有这些都是由objective-c设计的,objective-c允许你锯掉你坐着的树枝。所以它要求你表现得像个成年人。因此也没有私有方法。如果一个方法被宣布为私有,那么作为开发人员,你应该相应地表现出来。
现在谈谈可能的“解决方案”:
如果您的超级类无论如何都应该调用给定(final)方法:
那么macmade的 solution将您的方法设置为伪私有方法将非常有效。不过,隐藏方法声明的缺点是,从子类调用隐藏的方法会给编译器一个警告,基本上会阻止*(sic!)*你不能打电话给它。(但它不会阻止您调用该方法。它只会通过抛出编译器警告来避免您这样做。)
但是,如果子类希望调用给定(final)方法:
使用 delegation pattern并通过此操作只将那些允许重写的方法公开。
为了完全防止重写,您可以使用 class cluster& abstract factory模式,它隐藏您的实现类,从而完全防止重写。(苹果的 NSArrayNSDictionaryNSSet类可以做到这一点)
然而,你可能会注意到,对于缺乏保护的objective-c,人们通常只能在两者之间做出选择:开放性、保护性,而不是混合它们。

关于objective-c - 如何防止方法被错误覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com