OC
在 Objective-C 中,协变(Covariance)和逆变(Contravariance)通常与泛型和类型转换相关。
协变(Covariance)
协变允许你在返回类型上使用子类。下面是一个简单的示例,展示了协变的概念:
// 定义一个基类
@interface Animal : NSObject
- (NSString *)makeSound;
@end
@implementation Animal
- (NSString *)makeSound {
return @"Some generic animal sound";
}
@end
// 定义一个子类
@interface Dog : Animal
- (NSString *)makeSound;
@end
@implementation Dog
- (NSString *)makeSound {
return @"Woof";
}
@end
// 定义一个泛型方法
@interface Shelter : NSObject
- (Animal *)adoptAnimal; // 返回类型为 Animal,协变
@end
@implementation Shelter
- (Animal *)adoptAnimal {
return [[Dog alloc] init]; // 返回 Dog 类型的实例
}
@end
// 使用示例
Shelter *shelter = [[Shelter alloc] init];
Animal *animal = [shelter adoptAnimal];
NSLog(@"%@", [animal makeSound]); // 输出: Woof在这个例子中,Shelter 类的方法 adoptAnimal 返回一个 Animal 类型,但实际上返回的是 Dog 类型的实例,展示了协变的使用。
逆变(Contravariance)
逆变通常用于参数类型,可以让你在参数类型上使用父类。下面是一个简单的示例:
在这个例子中,ShapeHandler 类的方法 handleShape: 接受一个 Shape 类型的参数,但你可以传递 Circle 类型的实例,展示了逆变的使用。
总结
协变:在返回类型上允许使用子类(如
adoptAnimal返回Dog类型的实例作为Animal类型)。逆变:在参数类型上允许使用父类(如
handleShape:接受Shape类型的参数,但可以传递Circle类型的实例)。
希望这些示例能帮助您理解协变和逆变在 Objective-C 中的具体使用!如果您有其他问题,请随时问我。
Last updated