0

スーパークラス SuperClassYeh とサブクラス SubClassYeh があります。SuperClassYehにメソッドinheritTestがあり、SubClassYeh でオーバーライドinheritTestします。testSuperAndSelfSubClassYehのメソッドを呼び出して、プログラムの実行を開始します。このメソッドはfromYEH、SuperClassYeh の別のメソッドを呼び出します。では、 SuperClassYehfromYEHを呼び出したいと思います。inheritTestそれ、どうやったら出来るの?を使用すると、 SuperClassYeh ではなく、SubClassYeh で[self inheritTest]呼び出しが行われます。 全体の実行を開始するためのコード フラグメントを次に示します。inheritTest

SubClassYeh *testing = [[SubClassYeh alloc] init];
[testing testSuperAndSelf];

SuperClassYeh のコード フラグメントは次のとおりです。

- (void) fromYEH
{
    [self inheritTest]; //Calls the inheritTest in SubClassYeh, not SuperClassYeh
}

- (void) inheritTest
{
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}

SubClassYeh のコード フラグメントは次のとおりです。

- (void) inheritTest
{
    NSLog(@"Testing Indicator. Inside SubClassYeh inheritTest");
}

- (void) testSuperAndSelf
{
    [super fromYEH];  
}
4

5 に答える 5

5

これは、Objective-C での継承の意図された動作です。

selfが のインスタンスである場合SubClassYeh

[self inheritTest]

メッセージの送信元 (サブクラスまたはスーパークラス) に関係なく、(存在する場合)のSubClassYeh実装を呼び出します。inheritTest

[super fromYEH]との唯一の違いは、「fromYEH」メッセージのルックアップがスーパークラスで開始されることですが、 が のインスタンスである[self fromYEH]という事実は変わりません。selfSubClassYeh

また、Objective-C でメソッドがオーバーライドされるのを防ぐことはできません (Objective-C でスーパークラス メソッドがサブクラスによってオーバーライドされるのを回避する方法 - cまたはそのトピックに関する他の Q&A を参照)。

スーパークラスでできる唯一のことは、誤ってオーバーライドされていないメソッド名を選択することです。たとえば、メソッド名の前にクラス名を付けることです

于 2013-09-11T07:21:37.803 に答える
0

記録のために...

あなたがやりたいことは、別の視点から見れば、あなたが思っているほど難しいことではありません。

C 関数を定義して呼び出すだけです。

- (void) fromYEH
{
    inheritTest(self); //Calls the inheritTest() in SuperClassYeh
}

void inheritTest(SuperClassYeh *self)
{
    NSLog(@"Testing Indicator. Inside SuperClassYEH inheritTest");
}    

- (void) inheritTest
{
    inheritTest(self);
}

(私は名前が大好きです... ;)

于 2014-08-21T07:36:57.383 に答える
0

かなり奇妙な動作ですが、このようなことを試すことができます(実際にはテストしていません)

- (void) fromYEH
{
    bool isSubClass = [self isKindOfClass:[SubClassYeh class]];
    if(isSubClass == YES)
    {
        [super performSelector:@selector(inheritTest)];
    }
    else
    {
        [self inheritTest];
    }
}

とにかく、このコードが実際にうまくいくとしても、これは非常に悪い習慣だと思います。


編集:

XCodeでこれを確認しました。それはトリックをしません=)だからマーティンの答えに賛成=)

于 2013-09-11T07:34:58.857 に答える
0

[super fromYEH]SubClassYeh から呼び出すことができる場合[super inheritTest]、同じ方法で呼び出すことの問題点は何ですか?

于 2013-09-11T06:54:51.283 に答える
0

解決策を見つけました。を呼び出す代わりに[super fromYeh]testSuperAndSelfレシーバーをスーパークラスに変更します。を使用し[[[[SubClassYeh superclass] alloc] init] fromYEH]ます。method 内fromYEHでは、inheritTestofSuperClassYEHが呼び出されます。のメソッドの
コード フラグメントを次に示します。他のコードは同じままです。testSuperAndSelfSubClassYeh

- (void) testSuperAndSelf
{
    [[[[SubClassYeh superclass] alloc] init] fromYEH];  
}
于 2013-09-14T01:02:08.693 に答える