在iOS上,为什么可以实例化UIGestureRecognizer,如果它是一个抽象类?

时间:2012-04-29 00:02:50

标签: iphone objective-c ios abstract-class

使用UIGestureRecognizer的以下代码:

UIGestureRecognizer *gestureRecog = [[UIGestureRecognizer alloc] 
                                         initWithTarget:self 
                                         action:@selector(handletap:)];

[self.view addGestureRecognizer:gestureRecog];

实际上可以编译和运行。我以为abstract class无法实例化?

2 个答案:

答案 0 :(得分:5)

抽象类不是Objective-C中的语言特性(例如,与Java不同),因此它不是编译器可以强制执行的。

当一个类在文档中被标记为抽象时,它只是提示如何使用意图,但是运行时和编译器都不会实际阻止你直接实例化它

Objective-C编程语言指南中关于abstract classes的部分实际上指出NSView是一个抽象类的示例,有时您可以在没有子类化的情况下使用它,因此这样的概念不是与其他语言/框架一样严格。

答案 1 :(得分:1)

感谢omz的回答。这是Apple文档的相关摘录:

  

抽象类

     

某些类仅设计或主要设计为其他类可以   继承他们。这些抽象类将方法和实例分组   可以由多个子类用于公共的变量   定义。抽象类本身通常是不完整的,但是   包含有用的代码,减少了它的实现负担   子类。 (因为抽象类必须有子类   有用的,它们有时也被称为抽象超类。)

     

与其他语言不同,Objective-C没有标记语法   类是抽象的,也不会阻止您创建实例   一个抽象类。

     

NSObject类是一个抽象类的规范示例   可可。你永远不会在一个中使用NSObject类的实例   应用 - 对任何事情都没有好处;这将是一个通用的   能够不做任何事情的对象。

     

另一方面,NSView类提供了一个示例   抽象类,您可能偶尔使用的实例   直接

     

抽象类通常包含有助于定义结构的代码   一个应用程序。在创建这些类,实例的子类时   你的新课程毫不费力地适应应用程序结构   并自动与其他对象一起工作。