0

そのクラスに関する簡単な情報を返すクラスメソッドを定義するオブジェクトの特定のクラスがあると仮定すると、次のようになります。

+ (NSInteger) defaultValueForClass {
    return 5;
}

ここで、一連のサブクラスがあり、それぞれが異なる情報を提供するためにこのメソッドをオーバーライドするとします。私の質問は次のとおりです。関連するサブクラス メソッドが使用されるように、どの具体的なサブクラスが実行されているかを知らずに、そのクラス メソッドをどのように呼び出すことができますか? 私は単に行くことはできません:

[[anObject class] defaultValueForClass]

...この時点では、コンパイラはカスタム サブクラス メソッドを認識していないためです。

4

2 に答える 2

0

私のために働きます。

// car.m
#import <Foundation/Foundation.h>

@interface Car : NSObject
+ (void)make;
@end

@interface Honda : Car
@end

@interface Porsche : Car
@end

@implementation Car
+ (void)make { NSLog(@"generic"); }
@end

@implementation Honda
+ (void)make { NSLog(@"Honda"); }
@end

@implementation Porsche
+ (void)make { NSLog(@"Porsche"); }
@end

int main() {
    Porsche *porsche = [[Porsche alloc] init];
    [[porsche class] make];

    Car *supercar = (Car *)[[Honda alloc] init];
    [[supercar class] make];

    return 0;
}

また、コンパイルと実行の出力には、エラーや警告は表示されません。

$ clang -framework Foundation car.m -o car.o
$ ./car.o
2012-07-01 01:53:46.559 car.o[8127:707] ポルシェ
2012-07-01 01:53:46.561 car.o[8127:707] ホンダ

Xcode と GCC のどのバージョンを使用していますか? 古い GCC ですか、それとも LLVM-GCC ですか?

于 2012-07-01T08:56:11.713 に答える