使用某个对象类的类方法

时间:2012-08-14 18:25:41

标签: objective-c ios casting class-method

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

+ (NSString *)idString;

现在说你有一个对象

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

有没有办法调用适当的idString方法?我想也许:

[[object1 class] idString]

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

[object1 idString]

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

4 个答案:

答案 0 :(得分:1)

获取您拥有的实例的类对象[object class]并向其发送消息,这正是它应该如何工作的。类也是ObjC中的对象,您可以将相同的消息发送到不同的类,其方式与将intValue发送到NSStringNSNumber实例的方式完全相同(或{ {1}}(几乎)任何实例!)。这是ObjC的基础 - 该方法基于运行时的消息进行查找。如果这一行:

init

没有编译,那么你在别处有错误。这是完全合法的,也是你所做的事情。

[[object1 class] idString];

答案 1 :(得分:0)

[(Class)[object1 class] idString]

是要走的路。如果没有编译,请降低编译器的严格性(可能排除-pedantic,-Werr,-Wall等标志)。

答案 2 :(得分:0)

试试这个,

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

[object1 idString]会向您发出警告,因为您将其视为私有方法。你不能通过它的对象调用私有方法,你需要在它的实现本身中调用该方法。与[self idString]

一样

答案 3 :(得分:0)

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