1

このクラスとそのサブクラスがあるとしましょう

@interface MySuperClass
- (void)open:(id)type value:(id)value;
- (void)openWebpage:(NSURL*)url;
@end

@interface MySubClass
- (void)openWebpage:(MyBookmarkClass*)bookmark;
@end

そして、その呼び出しは を[someMySubclass openWebpage:someBookmark]呼び出します[super open:BookmarkClass value:self.url]。とopen:value呼び出します[self openWebpage:url]

これは非常に不自然なことだと思いますが、同様の状況に遭遇しました。私の混乱は、[self openWebpage:url]で呼び出されているにもかかわらずMySuperClass、 openWebpage: が実行されると、呼び出し元のコンテキストで実行されているMySubClassことNSURLです。

私の質問は次のとおりです。元のコンテキストで何かを強制的に呼び出す方法はありますか? または、チェーンを上って、一番上に最も近いメソッドを見つけることができる限り何度でも super を呼び出すかのようにしますか?

4

1 に答える 1

2

コンテキストは 1 つだけです。1 つのオブジェクトがあります。そのクラスはMySubClass.

互換性のない別の型でメソッドをオーバーライドしたのは誤りです。そうしないでください。これは、関数のオーバーロードを伴う C++ ではありません。引数の型に基づくディスパッチはありません。

メソッドの名前は、メソッドが何に作用するかによって命名するのが慣習です。したがって、名前付きのメソッドと、名前付きの別のメソッドが導入されている可能性が-openWebpageURL:ありMySuperClassます。から継承されたという名前のメソッドがまだあることに注意してください。MySubClass-openWebpageBookmark:MySubClass-openWebpageURL:MySuperClass

于 2012-04-27T03:47:07.213 に答える