指定Class类的子类

时间:2014-08-14 03:46:46

标签: objective-c class subclass

假设我有一个与类有关的功能:

- (void)doSomethingWithClass:(Class)class
{
    [class doSomething];
}

但当然没有为所有类定义方法+ (void)doSomething。假设它仅为SomeClass类的子类定义。如何“限制”赋予函数的class参数的类类型?我希望能够做到这样的事情:

- (void)doSomethingWithClass:(/* type of [SomeClass class] */)class
{
    [class doSomething];
}

所以我不必诉诸这样的事情:

- (void)doSomethingWithClass:(Class)class
{
    if (![class isSubClassOfClass:[SomeClass class]])
    {
        // error
    }
    [class doSomething];
}

在Objective-C中可以做到这一点,做这样的事情甚至是个好主意吗?

3 个答案:

答案 0 :(得分:1)

Class实际上是一个包含有关类类型的元数据的c结构。结构没有继承。

您可以通过传入对象类型的实例而不是Class结构类型来限制方法。

- (void)doSomethingWithClass:(SomeClass *)sender
{
    Class class = [sender class];
    [class doSomething];
}

如果您的方法确实必须接受Class对象作为参数,那么isKindOfClass:isSubclassOfClass就是您的选择。

答案 1 :(得分:1)

您应该使用Protocol,为您的类创建重用接口。如果你的类符合这个协议,那么它将实现doSomething方法。

@protocol ClassProtocol

+ (void)doSomething;

@end

@interface ClassEngine : NSObject
@end

@implementation ClassEngine

- (void)doSomethingWithClass:(Class)class {

    if([class conformsToProtocol:@protocol(ClassProtocol)])

        [(Class<ClassProtocol>)class doSomething];
    }
}

@end

答案 2 :(得分:0)

无法在Objective-C中指定此类型。但它可以在Swift中使用 - SomeClass.Type