1

よろしければ、私は自分自身にObjective-Cを有罪の喜びとして教えています。私はJava言語を強く理解していると自称しているので、それほど難しい移行ではありませんが、確かに楽しいです。しかし、悲しいかな、私の質問です!

PHPに存在するものを再現しようとしています:LateStaticBinding。PHPでは、メソッド呼び出しを「static ::」で修飾できます。これにより、実行時にそのメソッドが呼び出し元に動的にバインドされます。一方、キーワード「self ::」が使用されている場合、バインディングは静的であり、どの子クラスが呼び出すかに関係なく、それが存在するクラスに関連付けられます。

Obj-Cでは、このパラダイムを再現するのに苦労しています。私は私の大君主であるグーグルに、ココアで静的にバインドするのを遅らせる方法を尋ねましたが、それは可能ではないと思います。それは別の名前で呼ばれることもあれば、非常に頭の痛い回避策が必要になることもあります。これが私が今していることです:

親クラスメソッド:

-(id) whoAmI {
 return ([self class]);
}

子クラスChildClassは、ParentClassを拡張し、インスタンスメソッドwhoAmIをオーバーライドしません。

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]子供からの呼び出し:子

最終的には、可能であれば、Cocoaに動的なバインドを停止させて、whoAmIメソッドが常にそれが存在するオブジェクト(常にParent)を返すようにする方法を学びたいと思います。また、インスタンスメソッドにしたいです。どうすればこれを行うことができますか?

-ショーン

4

2 に答える 2

2

実際、Objective Cには強力なイントロスペクション機能のセットがあり、Appleの広範なObjective C Runtimeドキュメントを参照することで、ほぼ確実に目的の操作を実行できます。これは、ObjectiveCのオブジェクトとクラス階層の内部動作にアクセスするための完全なCAPIです。

他に何もないとしても、このようなものを実験することで、言語がどのように機能するかについて多くを学び、難しい問題のデバッグに役立つはずです。

于 2010-09-21T22:19:12.743 に答える
0

親クラス(またはスーパークラス)の名前を組み込むようにメソッドを変更します。

-(id) whoAmI {
 return ([Parent class]);    //In this instance, Parent is the superclass
}

たまたま、作成したいものは、クラスメッセージを親クラス自体(Parent)に静的にバインドすることによって実現する必要がありました。

于 2010-09-21T19:26:26.853 に答える