首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C中的多态性和缺省实现

Objective-C中的多态性和缺省实现
EN

Stack Overflow用户
提问于 2010-11-05 22:41:24
回答 3查看 510关注 0票数 0

基本上,我有一个父类超类,即被称为哺乳动物。哺乳动物默认情况下会扩展UIImageview。现在我有了tiger类,它依次扩展了哺乳动物类和哺乳动物类,也就是说,哺乳动物类有一个乳汁喂养婴儿方法。

在我的mammal.h类中,我声明了breastfeedbaby方法。

现在,我希望能够做一些事情,比如添加一个动物列表,它扩展了哺乳动物,并有自己的母婴实现,循环遍历和数组,然后仅强制转换为哺乳动物和哺乳动物母婴。

我想让每种动物都调用它们自己的乳汁喂养方法,因为它们都重写了它,但我的问题是,如果我在那里声明它,它将调用来自mammal.m的乳汁喂养婴儿。

在java中,我既可以使用一个接口,也可以只使用一个带有抽象方法的抽象类,然后让不同的实现覆盖该方法。

这有意义吗?我的问题是,如果我不省略mamal.m中的breastfeedbaby方法,它将调用mamal.m中的breastfeedbaby方法,而如果我省略了mamal.m中的breastfeedbaby方法,该类将是黄色的,并显示警告,说明我没有正确地实现mamal.h类。如果我这样做了,动物的乳汁喂养方法就会被调用。我是否应该在这里使用协议,但据我所知,协议与java中的接口是不同的。

我不知道这是否有意义,但不管怎样,谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-05 22:53:34

以下场景:

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];

  • Mammal.h

应该会产生:

哺乳动物

猴子

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

票数 5
EN

Stack Overflow用户

发布于 2010-11-05 23:07:28

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

代码语言:javascript
复制
@implementation Mammal

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

@end

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

票数 2
EN

Stack Overflow用户

发布于 2010-11-05 22:44:49

即使您将一个对象强制转换为哺乳动物,它仍然会为它的任何子类调用-breastfeedbaby方法。这是因为Objective-C使用消息发送。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4106920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档