Objective-C後期静的結合
-
04-10-2019 - |
質問
もしあなたがそうするなら、私は自分自身を有罪の喜びとして教えています。私はJava言語を自称している強い把握をしているので、それは ひどく難しい トランジション - 確かに楽しいです。しかし、悲しいかな、私の質問!
私はPHPに存在するものを再現しようとしています:後期静的結合。 PHPでは、「static ::」でメソッドコールを飾ることができます。これは、その方法を実行時に発信者に動的に結合します。一方、キーワード「self ::」が使用される場合、バインディングは静的であり、子のクラスがそれを呼ぶかどうかに関係なく、それが存在するクラスに関連付けられています。
OBJ-Cでは、このパラダイムを再現するのが困難です。 Google、Google、Cocoaで静的に拘束する方法を尋ねましたが、それが可能だとは思いません。それは何か他のものと呼ばれるかもしれません、またはそれは非常に過剰な頭の回避策を必要とするかもしれません。これが私が今していることです:
親クラス方法:
-(id) whoAmI {
return ([self class]);
}
チャイルドクラスの保育は、ペアレントクラスを拡張し、インスタンスメソッドフーアミを無効にしません。
NSLog(@"Calling from PARENT: %@", [parent whoAmI]);
NSLog(@"Calling from CHILD: %@", [child whoAmI]);
各クラスのオブジェクトにメッセージを送信すると、動的バインディングはそれがすべきことを行い、nslog()から以下を取得します。
2010-09-21 11:39:07.484 Whoami [4803:A0f]親からの呼び出し:親:
2010-09-21 11:39:07.486 Whoami [4803:A0f] Chall from Child:Child
最終的には、可能であれば、ココアに動的に結合を停止する方法を学びたいと思います。また、インスタンスメソッドにしたいです。これをどうやってやろうと思いますか?
- シーン
解決
実際、客観的なCには強力な一連の内省機能があり、Appleの広範囲に言及することで、ほぼ確実にあなたが望むことをすることが可能です 目的Cランタイムドキュメント. 。これは、目的Cのオブジェクトとクラスの階層の内部仕組みにアクセスするための完全なC APIです。
他に何もなければ、このようなことを実験することで、言語がどのように機能するかについて多くのことを学び、困難な問題をデバッグするのに役立つはずです。
他のヒント
メソッドを変更して、親クラス(またはスーパークラス)の名前を組み込む:
-(id) whoAmI {
return ([Parent class]); //In this instance, Parent is the superclass
}
クラスメッセージを親クラス自体に静的にバインドすることで、作成したいものを作成したいと思うことが必要でした。