0

假设您有 A 类,A1、A2 和 A3 类继承自这些 A。所有四个类都实现了一个类方法:

+ (NSString *)idString;

现在说你有一个对象

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

有什么方法可以调用适当的 idString 方法吗?我想也许:

[[object1 class] idString]

但这不会编译,说不知道选择器 idString 的类方法。我还想过将 idString 视为私有方法并调用

[object1 idString]

但这表示没有接口声明选择器 idString

4

4 回答 4

1

获取您拥有的实例的类对象[object class]并向其发送消息,这正是它应该如何工作的。类也是 ObjC 中的对象,您可以将相同的消息发送到不同的类,就像您可以发送intValue到一个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)[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 回答
0

如果你试图调用一个类方法,只需调用它[Class method],这是因为你调用的方法与对象本身没有关系,实例化的对象和被调用的方法之间没有关系。因此它是一个类方法。

于 2012-08-14T18:35:36.363 回答