【发布时间】:2012-11-27 10:45:14
【问题描述】:
我想在 Objective-C 项目中创建抽象类。
但是,我找不到诸如“抽象”(在 java 中)、“虚拟”(在 c++ 中)之类的想法。
Objective-C 没有抽象概念吗?谢谢。
【问题讨论】:
标签: objective-c abstract-class
我想在 Objective-C 项目中创建抽象类。
但是,我找不到诸如“抽象”(在 java 中)、“虚拟”(在 c++ 中)之类的想法。
Objective-C 没有抽象概念吗?谢谢。
【问题讨论】:
标签: objective-c abstract-class
正式地说,不。抽象类是通过在基类中存根方法来实现的,然后记录子类必须实现这些方法。作者有责任编写与类契约匹配的类,而不是编译器检查缺失的方法。
Objective-C 有 protocols,类似于 Java 接口。如果您正在寻找与纯虚拟 C++ 类或Java 中的接口 等价物,这就是您想要的。
【讨论】:
没有抽象类,但您可以使用 class 和 protocol 的组合生成类似的东西(类似于 Java 的 接口)。首先将您的抽象类划分为您希望为其提供默认实现的方法和您需要子类来实现的方法。现在在@interface 中声明默认方法并在@implementation 中实现它们,并在@protocol 中声明所需的方法。最后从 class<protocol> 派生您的子类 - 一个实现协议的类。例如:
@interface MyAbstract
- (void) methodWithDefaultImplementation;
@end
@protocol MyAbstract
- (void) methodSubclassMustImplement;
@end
@implementation MyAbstract
- (void) methodWithDefaultImplementation { ... }
@end
@interface MyConcreteClass: MyAbstract<MyAbstract>
...
@end
@implementation MyConcreteClass
// must implement abstract methods in protocol
- (void) methodSubclassMustImplement { ... }
@end
如果您担心对类和协议使用相同的名称,请查看 Cocoa,其中 NSObject 遵循此模式...
HTH
【讨论】:
super 调用基类实现。