如何阻止超类方法被调用到子类

时间:2008-11-27 15:50:08

标签: objective-c cocoa

我正在使用子类扩展类的功能,而我正在做一些使子类的上下文中的超类方法变得危险(应用程序将在循环中挂起)的脏东西。我知道这不是一个天才的想法,但是我会选择低调的果实,现在它会节省我一些时间。哦,这是一份肮脏的工作,但有人必须这样做。

底线,我需要从外部阻止该方法,或者在直接调用超类时抛出异常。 (但我仍然从子类中使用它,除非小心)。

最好的方法是什么?

更新---

所以这就是我的目标。我不是自我回答,因为Boaz的回答提到了多种有效的方法,这就是适合我的方式。在子类中,我重写了这样的方法:

- (int)dangerousMethod
{
  [NSException raise:@"Danger!" format:@"Do not call send this method directly to this subclass"];
  return nil;
}

我将此标记为已回答,但显然这并不意味着它已经结束,欢迎提出进一步的建议。

5 个答案:

答案 0 :(得分:6)

只要新实现不调用不安全的超类方法,只需在子类中重新实现不安全的方法并让它不执行任何操作或抛出异常或重新实现它是安全的。

对于这里的C ++工作人员:Objective C不允许您将方法标记为私有。您可以使用其类别系统将界面拆分为单独的文件(从而隐藏“私有”文件),但类中的所有方法都是公共的。

答案 1 :(得分:6)

您可以在子类的.h文件中覆盖要阻止的任何方法。您可以将以下内容放入dangerousMethod文件中,以使.h无法使用。

- (int)dangerousMethod __attribute__((unavailable("message")));

这将使dangerousMethod方法对使用您的子类的任何人都不可用。

为了防止其他代码使用超类的版本此方法,您可以将其放在.m文件中进一步限制。

- (int)dangerousMethod 
{
    return nil;     
}

答案 2 :(得分:1)

注意:我是ObjC / Cocoa的新人:

@implementation MyClass
-(void)myMethod:(NSString *)txt{
    if([self class] != [MyClass class]) return;
    NSLog(@"Hello");
}
@end

彼得

答案 3 :(得分:1)

本文介绍如何创建private variables in Objective C。它们不是真正的私有,但是从我读到的内容来看,如果你试图从子类中调用它们,编译器将发出警告。

答案 4 :(得分:-3)

如果在超类中创建方法为“private”,则子类无法调用它们。我不熟悉Objective C,但我见过的所有其他面向对象语言都有“私有”限定符。