0

私はしばらくの間、いくつかの言語を調べ、Objective-C を調べました。

[super message];

実際、次のような形式があれば、より正確ではありませんか。

[self super#message];

? これは、同じオブジェクト にメッセージを送信しているためです。これは ですselfが、メッセージは別のものであり、スーパークラスの の定義ですmessageselfということは、単語を変えずにその部分を変えた方が正確ではないmessageでしょうか?

更新:これは Javascript の方法との比較です:

Author.superclass.call(this)

AuthorスーパークラスはPerson. したがって、 と同じ[this superclass's constructor]、または と同じです[self super#init]( initJavascript の と コンストラクターはまったく同じではありませんが、例として使用するだけです)。

4

3 に答える 3

2

純粋に API の観点から (これが参照する)、これは意味がありません。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

Super は self とほぼ同じですが、独自のクラスで定義されたメソッドを呼び出すのではなく、代わりにスーパー クラスを呼び出します。とにかく、プログラミングにハッシュタグを追加するのは悪いようです...

于 2012-10-02T13:13:19.460 に答える
0

それは同じではないでしょう。

まず、サブクラス化するたびにメソッドの名前を変更する必要がないため、OOP パラダイムが壊れます。

次に、次のようなクラス階層があるとします。

  • クラス A、メソッド foo および superfoo が宣言されている
  • クラス B、クラス A を継承、メソッド foo を宣言
  • クラス C、クラス B を継承、メソッド foo を宣言

[instanceOfC superfoo] を呼び出すと、B のメソッド foo ではなく、A のメソッドが呼び出されます。

" super#" を単なる構築ロジックにするつもりだったとしても、Objective-C のメソッドの動的解決ロジックは実際には尊重されないため、役に立ちません。

とにかく、それは単なる構文の問題です。parentClassObjective-C 言語の構文はこのように定義されています。代わりに、superまたは任意の構造などを使用する必要があったと主張できます。それはsuper#単なる言語定義であり、とにかく選択を行う必要がありました;)

于 2012-10-02T13:23:38.590 に答える