【问题标题】:Objective-C class inheritance and allocationObjective-C 类继承和分配
【发布时间】:2011-04-30 14:02:59
【问题描述】:

鉴于下面的行,其中 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对象中实现的所有实例方法。

有什么不同意见吗?

【问题讨论】:

    标签: objective-c inheritance alloc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      这两个实例都是 Square 对象。

      行:

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

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

      如果您发送 george Monkey 消息,您将收到有关未找到选择器的运行时错误。除非您的 Monkey 消息恰好与 Square 消息匹配(这将发生在它们的公共超类中的方法上)。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-18
          • 2012-03-10
          • 1970-01-01
          • 2016-05-16
          • 2013-09-26
          • 2011-05-10
          • 2014-03-08
          • 1970-01-01
          相关资源
          最近更新 更多