0

我研究了一些语言,然后看看 Objective-C 的

[super message];

事实上,如果有某种形式,不是更准确:

[self super#message];

? 那是因为我们仍然向同一个对象发送消息,即self,但消息是不同的,这是message超类中定义的。那么不改wordself而是改messagepart不是更准确吗?

更新:这是 Javascript 方式之间的比较:

Author.superclass.call(this)

Author的超类是Person。所以跟[this superclass's constructor]_ _[self super#init]init

4

3 回答 3

2

从纯粹的 API 角度来看(this 所指),这是没有意义的。如果您查看与向selfvs发送消息相关的 API super,您会看到以下内容:

objc_msgSend

id objc_msgSend(id theReceiver, SEL theSelector, ...)

在这种情况下,theReceiverisselftheSelectoris message(之后是 args 列表,我们现在不会进入)。

将此与 objc_msgSendSuper进行比较:

id objc_msgSendSuper(struct objc_super *super, SEL op,  ...)

等一下,接收器需要完全不同的类型!研究什么super手段给了我们以下声明:

struct objc_super
{
    id receiver;
    Class class;
};

精明的用户会注意到这个定义在 ARC 中是无效的,但这超出了本文的范围。

那么struct objc_super,允许我们做的是向继承链中某处的特定类发送特定消息,如果我们愿意,这实际上允许我们跳过大部分实现。

因此,话虽如此,您应该这样做的“真正”方式将是 Java 匿名类(或 C++)等价物:

[MySuperclass.self message];

但是,这是无效的,因为所有类型都self已经声明了消息,指向它们自己!因此,我们最终使用super关键字作为

&(struct objc_super) { self, [[self class] superclass] }

反而。

于 2012-10-02T13:47:18.020 回答
0

它不会是一样的。

首先,它会破坏 OOP 范式,因为您不需要在每次子类化时更改方法的名称。

接下来,假设您有这样的类层次结构:

  • 类 A,方法 foo 和 superfoo 声明
  • B 类,继承 A 类,声明方法 foo
  • C类,继承B类,声明方法foo

然后调用 [instanceOfC superfoo] 将调用 A 中的方法,而不是 B 中的方法 foo。

如果你的意思是“ super#”只是一个构造逻辑,那也无济于事,因为Objective-C中方法的动态解析逻辑不会真正得到尊重。

无论如何,这只是语法问题。Objective-C 语言语法是这样定义的,你可以争辩说他们应该使用parentClass代替super或任何super#构造或其他任何东西,这只是语言定义,无论如何他们都必须做选择;)

于 2012-10-02T13:23:38.590 回答
0

Super 与 self 几乎相同,只是您不是调用在自己的类中定义的方法,而是调用您的超类。无论如何,在编程中添加主题标签似乎很糟糕......

于 2012-10-02T13:13:19.460 回答