【问题标题】:Force child classes to override method强制子类覆盖方法
【发布时间】:2011-05-21 06:35:00
【问题描述】:

我怎样才能使从我的基类继承的任何类都被强制覆盖特定方法?我不想使用协议,因为那不会使这种行为自动化。

@interface MyBaseClass : NSObject 
{
}

- (void)performAnAction;

@end

@implementation MyBaseClass

- (void)performAnAction
{
    @throw([NSException exceptionWith...]);
}

@end

【问题讨论】:

    标签: objective-c inheritance overriding oop


    【解决方案1】:

    你到底是什么意思,强迫他们覆盖它?如果您只是像这样实现父方法:

    - (void)performAction {
        NSAssert(NO, @"The method %@ in %@ must be overridden.",
             NSStringFromSelector(_cmd), NSStringFromClass([self class]));
    }
    

    如果子类未能覆盖它,它将在运行时抛出异常。不幸的是,没有办法在编译时强制执行此操作。

    【讨论】:

    • 所以也不可能显示警告?
    • 不。只需适当地记录类,以便很明显需要重写此方法。
    • @JamesBillingham:任何编写调用[super performAction] 的子类的人都会很快了解到这在这种情况下是不合适的。理想情况下,类头文件将记录任何实现者不应调用super
    • 我实现了一个#if defined DEBUG NSLOg & NSAssert,这样它至少不会在发布时崩溃。 FWIW
    【解决方案2】:

    你可以抛出一个异常。只要这是有据可查的,那么 IMO 这是对异常的合理使用,因为它确实是一个编程错误。

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 2011-11-14
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多