Objective-C中的多态性和默认实现

时间:2010-11-05 14:41:24

标签: objective-c oop polymorphism

基本上我有一个Parent超类,即MAMMAL。哺乳动物默认扩展UIImageview。现在我有虎类,它反过来扩展了MAMMAL类,而哺乳动物类则是母乳喂养方法。

在我的哺乳动物课上,我宣布使用母乳喂养方法。

现在,我希望能够做一些事情,例如添加一个动物列表,这些动物可以扩展哺乳动物,并拥有自己的母乳喂养实施,循环播放和阵列,然后施放给哺乳动物并做[哺乳期母乳喂养宝宝]。

我希望每只动物都能使用自己的母乳喂养方法,因为它们都覆盖了它,但我的问题是它会从哺乳动物那里调用母乳喂养。如果我在那里宣布它。

在java中,我可以使用接口,也可以只使用抽象类的抽象类,并使用不同的实现覆盖方法。

这有意义吗?我的问题是,如果我不在哺乳动物中省略哺乳宝宝的方法,那么它将在哺乳动物中称为哺乳宝宝方法。如果我在哺乳动物中省略了母乳喂养方法。该课程将是黄色的警告说我没有正确实现mammal.h类。如果我这样做,就会调用动物的母乳喂养方法。我应该在这里使用协议,但据我所知,协议与java中的接口不同。

我不知道它是否有意义,但无论如何都要感谢。

3 个答案:

答案 0 :(得分:5)

以下情景:

  • Mammal.h:- (void)method;
  • Mammal.m:- (void)method { NSLog(@"Mammal"); }
  • Monkey.h:@class Monkey : Mammal
  • Monkey.m:- (void)method { [super method]; NSLog(@"Monkey"); }
  • Somewhere.m:Mammal *monkey = [[Monkey alloc] init]; [monkey method];

应该屈服:

  

哺乳动物

     

更新:当然,如果您愿意,可以删除对[super method]的通话。只是展示了可能性。

答案 1 :(得分:2)

Objective-C动态解析所有内容,因此它没有抽象基类或接口。最接近抽象方法的是编写一个抛出异常的默认实现(在父类中)。

@implementation Mammal

- (void)breastfeedBaby
{
    [NSException raise:@"MethodNotImplemented"
                format:@"Class %@ failed to implement required method %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
}

@end

在编译时捕获缺少的方法会很好,但在动态类型的语言中这是不可能的。

答案 2 :(得分:0)

即使你将一个对象转换为一个MAMMAL,它仍然会为它的子类调用-breastfeedbaby方法。这是因为Objective-C使用消息发送。