Abstract class for Objective-C
Possible Duplicate:
Creating an abstract class in Objective C
我想在Objective-C项目中做抽象类。
但是,我找不到类似于"抽象"(Java)、"虚拟"(C++)的思想。
客观C没有抽象的概念吗?谢谢您。
没有抽象类,但是可以使用类和协议(类似于Java的接口)的组合来生成类似的东西。首先,将抽象类划分为希望为其提供默认实现的方法和需要子类实现的方法。现在在@interface中声明默认方法,并在@implementation中实现它们,在@protocol中声明所需方法。最后,从class派生您的子类——一个实现协议的类。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @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遵循此模式…
高温高压
- 我发现的问题是,如果我对这些方法中的任何一个调用super,则会收到警告"[super class]可能不会响应'[method name].'",我可以消除此警告的唯一方法是在抽象类中实现协议。但如果我这样做了,它们实际上就变成了公开的方法,从而破坏了目标……
- @乔维-我不明白你想做什么。超类不实现抽象方法,也就是说,所有子类都实现抽象方法。对于抽象方法,您希望调用super做什么?
- 我想我可能没有正确使用抽象模型。我想让我的超类完成所有默认的case操作,但是为了让我的子类重写某些方法,添加它们自己的操作,并且能够为默认操作调用super。
- @Jowie-你描述的是正常遗传。只需声明基类中的所有方法并为它们提供默认实现。任何派生类都可以重写基类方法并使用super调用基类实现。
- 是的-我想我必须把它们公开,因为obj-c中没有保护措施。
- @jowie-您是正确的,obj-c中没有受保护的方法。但是有一些模式,例如使用类别和多个头文件,它们在编译时提供类似的语义。去谷歌,如果你对答案有疑问,你会发现你可以一直这样问。
- 这是模仿抽象类的一个好主意…
- @CRD I不能在methodWithDefaultImplementation内调用methodSubclassMustImplement,除非MyAbstract类符合MyAbstract协议。这不是抽象类的全部意义吗?如果抽象类符合协议,那么我将在抽象类中得到一个警告method not implemented。
- @大多数情况下,您可以创建一个private.h,其中包含实现接口的抽象类的一个类别,然后将其包含在子类中。
从形式上讲,抽象类是通过在基类中删除方法来实现的,然后记录子类必须实现这些方法。作者有责任编写与类合同匹配的类,而不是编译器来检查缺少的方法。
Objtovi-C具有类似Java接口的协议。如果你在爪哇寻找一个等价于纯C++的类或接口,这就是你想要的。
- 我会更进一步地说,Objective-C实际上不做抽象类。使用支持Objut-C的鸭子打字理想的协议,而不是C++的普通基类。
- 通过让基类实现键方法以引发描述性异常,可以强制重写键方法。
- @Wadetregaskis:在格式良好的Objective-C中,我希望大量使用协议并避免使用这些伪造的C++特性。也就是说,生产Objto-C(通常)通常是由知道C++的人编写的,而不是很多Objul-C编写的。