使用UIGestureRecognizer的以下代码:
UIGestureRecognizer *gestureRecog = [[UIGestureRecognizer alloc]
initWithTarget:self
action:@selector(handletap:)];
[self.view addGestureRecognizer:gestureRecog];
实际上可以编译和运行。我以为abstract class无法实例化?
答案 0 :(得分:5)
抽象类不是Objective-C中的语言特性(例如,与Java不同),因此它不是编译器可以强制执行的。
当一个类在文档中被标记为抽象时,它只是提示如何使用意图,但是运行时和编译器都不会实际阻止你直接实例化它
Objective-C编程语言指南中关于abstract classes的部分实际上指出NSView
是一个抽象类的示例,有时您可以在没有子类化的情况下使用它,因此这样的概念不是与其他语言/框架一样严格。
答案 1 :(得分:1)
感谢omz的回答。这是Apple文档的相关摘录:
抽象类
某些类仅设计或主要设计为其他类可以 继承他们。这些抽象类将方法和实例分组 可以由多个子类用于公共的变量 定义。抽象类本身通常是不完整的,但是 包含有用的代码,减少了它的实现负担 子类。 (因为抽象类必须有子类 有用的,它们有时也被称为抽象超类。)
与其他语言不同,Objective-C没有标记语法 类是抽象的,也不会阻止您创建实例 一个抽象类。
NSObject类是一个抽象类的规范示例 可可。你永远不会在一个中使用NSObject类的实例 应用 - 对任何事情都没有好处;这将是一个通用的 能够不做任何事情的对象。
另一方面,NSView类提供了一个示例 抽象类,您可能偶尔使用的实例 直接
抽象类通常包含有助于定义结构的代码 一个应用程序。在创建这些类,实例的子类时 你的新课程毫不费力地适应应用程序结构 并自动与其他对象一起工作。