假设您有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
答案 0 :(得分:1)
获取您拥有的实例的类对象[object class]
并向其发送消息,这正是它应该如何工作的。类也是ObjC中的对象,您可以将相同的消息发送到不同的类,其方式与将intValue
发送到NSString
或NSNumber
实例的方式完全相同(或{ {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]
调用类方法,这是因为你调用的方法与对象本身无关,实例化对象和方法之间没有关系。被召唤。因此它是一种类方法。