0

クラス A1、A2、および A3 が継承するクラス A があるとします。4 つのクラスはすべて、クラス メソッドを実装します。

+ (NSString *)idString;

今、あなたがオブジェクトを持っているとしましょう

A *object1; //object may be of type A1, A2, or A3

適切な idString メソッドを呼び出す方法はありますか? 私は多分思った:

[[object1 class] idString]

しかし、それはコンパイルされません。idString をプライベートメソッドのように扱って呼び出すことも考えました

[object1 idString]

しかし、それは、セレクタidStringを宣言するインターフェースがないことを示しています

4

4 に答える 4

1

所有しているインスタンスのクラスオブジェクトを取得し、[object class]それにメッセージを送信することは、まさにこれが機能することになっている方法です。intValueクラスはObjCでもオブジェクトであり、NSStringまたはNSNumberインスタンス(またはinit(ほぼ)任意のインスタンス)に送信するのとまったく同じ方法で、同じメッセージを異なるクラスに送信できます。これはObjCの基本です。メソッドは実行時のメッセージに基づいて検索されます。この行の場合:

[[object1 class] idString];

コンパイルされていない場合は、他の場所でエラーが発生します。それは完全に合法であり、あなたが説明していることを行う方法です。

#import <Foundation/Foundation.h>

@interface Johnathan : NSObject
+ (NSString *)aNaughtyPhrase;
@end

@implementation Johnathan

+ (NSString *)aNaughtyPhrase
{
    return @"Knickers";
}

@end

@interface Johnny : Johnathan @end
@implementation Johnny

+ (NSString *)aNaughtyPhrase
{
    return @"Botty";
}

@end

@interface John : Johnathan @end
@implementation John

+ (NSString *)aNaughtyPhrase
{
    return @"Woo-woo";
}

@end

@interface Jack : Johnathan @end
@implementation Jack

+ (NSString *)aNaughtyPhrase
{
    return @"Semprini";
}

@end

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Johnathan * jt = [Johnathan new];
        Johnny * jy = [Johnny new];
        John * jn = [John new];
        Jack * jk = [Jack new];

        NSLog(@"%@", [[jt class] aNaughtyPhrase]);
        NSLog(@"%@", [[jy class] aNaughtyPhrase]);
        NSLog(@"%@", [[jn class] aNaughtyPhrase]);
        NSLog(@"%@", [[jk class] aNaughtyPhrase]);

    }
    return 0;
}
于 2012-08-14T18:43:17.287 に答える
0

クラス メソッドを呼び出そうとしている場合は、 で呼び出すだけ[Class method]です。これは、呼び出しているメソッドがオブジェクト自体と関係がなく、インスタンス化されたオブジェクトと呼び出されているメソッドの間に関係がないためです。したがって、それはクラスメソッドです。

于 2012-08-14T18:35:36.363 に答える
0
[(Class)[object1 class] idString]

行く方法です。それがコンパイルされない場合は、コンパイラの厳密性を下げます (おそらく、-pedantic、-Werr、-Wall などのフラグを除外します)。

于 2012-08-14T18:29:28.347 に答える
0

これで試してみてください。

if([object1 isKindOfClass:A])
{
  [A idString];
}
else if([object1 isKindOfClass:A1])
{
  [A1 idString];
}

[object1 idString]プライベート メソッドとして扱ったため、警告が表示されます。オブジェクトによってプライベート メソッドを呼び出すことはできません。実装自体でそのメソッドを呼び出す必要があります。お気に入り[self idString]

于 2012-08-14T18:34:02.517 に答える