强制子类重写方法

23

我如何让任何继承我的基类的类都必须覆盖特定方法?我不想使用协议,因为那样不能自动执行此行为。

@interface MyBaseClass : NSObject 
{
}

- (void)performAnAction;

@end

@implementation MyBaseClass

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

@end
2个回答

46

您所说的“强制覆盖它”,具体是什么意思?如果您只是像这样实现父级方法:

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

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


那么也不能显示警告吗? - aryaxt
1
不需要。只需适当地记录类,以便明确表明需要覆盖此方法。 - Lily Ballard
3
任何编写调用[super performAction]的子类的人都会很快意识到在这种情况下这样做是不合适的。理想情况下,类头文件应记录任何实现者不应调用super - Lily Ballard
我实现了一个#if defined DEBUG NSLOg & NSAssert,这样至少在发布时不会崩溃。FWIW - cbrulak

1

你可以直接抛出异常。只要这是有良好文档记录的,那么在我看来,这是异常的合理使用,因为它确实是一个编程错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接