基本上,我有一个父类超类,即被称为哺乳动物。哺乳动物默认情况下会扩展UIImageview。现在我有了tiger类,它依次扩展了哺乳动物类和哺乳动物类,也就是说,哺乳动物类有一个乳汁喂养婴儿方法。
在我的mammal.h类中,我声明了breastfeedbaby方法。
现在,我希望能够做一些事情,比如添加一个动物列表,它扩展了哺乳动物,并有自己的母婴实现,循环遍历和数组,然后仅强制转换为哺乳动物和哺乳动物母婴。
我想让每种动物都调用它们自己的乳汁喂养方法,因为它们都重写了它,但我的问题是,如果我在那里声明它,它将调用来自mammal.m的乳汁喂养婴儿。
在java中,我既可以使用一个接口,也可以只使用一个带有抽象方法的抽象类,然后让不同的实现覆盖该方法。
这有意义吗?我的问题是,如果我不省略mamal.m中的breastfeedbaby方法,它将调用mamal.m中的breastfeedbaby方法,而如果我省略了mamal.m中的breastfeedbaby方法,该类将是黄色的,并显示警告,说明我没有正确地实现mamal.h类。如果我这样做了,动物的乳汁喂养方法就会被调用。我是否应该在这里使用协议,但据我所知,协议与java中的接口是不同的。
我不知道这是否有意义,但不管怎样,谢谢你。
发布于 2010-11-05 22:53:34
以下场景:
H:- (void)method;
- (void)method { NSLog(@"Mammal"); }
@class Monkey : Mammal
- (void)method { [super method]; NSLog(@"Monkey"); }
Mammal *monkey = [[Monkey alloc] init]; [monkey method];
应该会产生:
哺乳动物
猴子
更新:当然,如果您愿意,您可以删除对[super method]的调用。只是展示了一种可能性。
发布于 2010-11-05 23:07:28
Objective-C动态地解决了所有问题,因此它没有抽象的基类或接口。最接近抽象方法的方法是编写一个抛出异常的默认实现(在父类中)。
@implementation Mammal
- (void)breastfeedBaby
{
[NSException raise:@"MethodNotImplemented"
format:@"Class %@ failed to implement required method %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
}
@end在编译时捕获缺少的方法是很好的,但这在具有动态类型的语言中是不可能的。
发布于 2010-11-05 22:44:49
即使您将一个对象强制转换为哺乳动物,它仍然会为它的任何子类调用-breastfeedbaby方法。这是因为Objective-C使用消息发送。
https://stackoverflow.com/questions/4106920
复制相似问题