0

给定下面的行,其中 Square 是 Rectangle 的子类:

Rectangle *thisObject = [[Square alloc] init];

thisObject 包含: 1. Square 对象的所有实例变量。2. Square 对象中实现的所有实例方法。3. 一个 Rectangle 对象的所有实例变量。4. Rectangle 对象中实现的所有实例方法。

给定下面的行,其中 Square 是 Rectangle 的子类:

Square *thisObject = [[Square alloc] init];

thisObject 包含: 1. Square 对象的所有实例变量。2. Square 对象中实现的所有实例方法。3. Rectangle 对象中实现的所有实例方法。

有什么不同意见吗?

4

3 回答 3

4

不,这些是相同的。两者之间的唯一区别是,如果您尝试向类型为 Rectangle 的 thisObject 发送 Square 消息,您将收到来自编译器的警告。但这只是一个警告,消息发送实际上会在运行时工作。

于 2011-04-30T14:07:55.623 回答
3

我不同意。您错过了第二个还包含 Rectangle 对象的所有实例变量。

两个实例完全相同。实例是,除了类集群之类的东西,你将它们分配为什么,而不是你后来声称它们是什么。

这两个实例都是 Square 对象。

该行:

Monkey *george = [[Square alloc] init];

没有做任何事情让乔治成为猴子。他是一个广场。如果您向他发送 Monkey 不响应的消息,编译器会警告您,但如果它们是 Square 消息(或 Square 的任何超类),他将作为 Square 响应。

如果你发送 george Monkey 消息,你会得到关于 selector not found 的运行时错误。除非您的 Monkey 消息恰好与 Square 消息匹配(这将在其公共超类中的方法中发生)。

这就是多态性。你可以声称乔治是一只猴子,或者一个圆圈,或者只是一个身份,但他会以他的身份回应,一个正方形。

于 2011-04-30T14:32:10.680 回答
1

你是对的。指针的类型与对象本身的类型无关。它只是让编译器更容易检查类型。您也可以使用id所有对象,并且它们的行为不会改变。

于 2011-04-30T14:08:14.377 回答