0

以下代码使用UIGestureRecognizer

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

[self.view addGestureRecognizer:gestureRecog];

可以实际编译运行。我认为抽象类不能被实例化?

4

2 回答 2

5

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

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

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

于 2012-04-29T00:18:54.333 回答
1

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

抽象类

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

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

NSObject 类是 Cocoa 中抽象类的典型示例。你永远不会在应用程序中使用 NSObject 类的实例——它对任何事情都没有好处;这将是一个通用对象,能够不做任何特别的事情。

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

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

于 2012-04-29T00:32:26.840 回答