2011-04-30 72 views
0

下面给出其中广场是矩形的子类的行:Objective-C类继承和分配

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

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

下面给出其中方是矩形的子行:

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

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

有分歧吗?

回答

3

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

两个实例完全相同。除类集群之外,实例是你分配它们的东西,而不是你以后声称它们的东西。

这两个实例都是Square对象。

行:

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

没有做任何事情,使乔治的一只猴子。他是一个广场。编译器会警告你,如果你给他发送Monkey没有回应的消息,但是如果他们是Square消息(或Square的任何超类),他会以Square的形式响应。

如果您发送了乔治猴子邮件,您将收到有关未找到选择器的运行时错误。除非你的Monkey消息恰好匹配Square消息(这将在其公共超类中的方法中发生)。

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

4

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

1

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