2012-02-03 85 views
0

所以我已经创建了一个UIViewController的子类。问题是,有没有办法让我可以强制调用一个使用子类的方法,如果我创建的是超类。我知道这很愚蠢,因为这与强迫哺乳动物称狗的行为是一样的。但在做这件事之前,我确实首先确定那只哺乳动物是一只狗,否则我不会说它。这是一件坏事吗?如果没有,那我该怎么做这样的事情?我尝试将超类转换为它的子类,然后执行方法调用,但不起作用。有什么想法吗?强制调用UIViewController的子类方法

所以我正在尝试做什么。我有一个UIViewController A和那个B的子类。如果我有A并且我想调用B的方法来覆盖A,那么我该怎么做?我希望这是明确的

+0

我不太确定我明白你的意思。你可以发布你的代码,所以我可以看到你想要做什么? – 2012-02-04 00:04:17

+0

添加了一行代码,说明我的意思 – xonegirlz 2012-02-04 00:08:18

+0

子类化的重点是覆盖超类方法或添加新方法。所以你会创建一个子类的实例并调用该方法。你为什么要把超类转换成子类? – mbh 2012-02-04 00:08:45

回答

4

你如何声明你的对象和它的实际是有区别的。 考虑这个例子:

Mammal *mammal = [[Dog alloc] init]; //Dog is a subclass of Mammal 

在这里,你有一个指向Mammal对象,它实际指向的专业化Dog类的一个实例。这是有效的,因为哺乳动物拥有一只狗拥有的所有方法。

您可以检查一些Mammal实例实际上是Dog是使用isKindOfClass:,像这样:

if ([mammal isKindOfClass:[Dog class]]) { 
    [(Dog *)mammal bark]; 
} 

这是完全有效的。但是,如果您将创建mammal[[Mammal alloc] init]Dog类的检查将失败,您将无法调用任何只有Dog具有的方法。如果你不做这个检查,这实际上会崩溃,因为这个转换不会以任何方式改变对象,它只是告诉编译器“我知道我在做什么,不要警告我”。

1

我相信你只能上升的层次结构,而不是下降。所以,基本上,你可以从你的类中调用超类,但不能调用子类。这里没有关系,除非你通过将自己的引用传递给它的超类来初始化你的子类。

这是有点你在找什么?

+0

嗯..我初始化它,因为它的超类 – xonegirlz 2012-02-04 00:15:30

+0

我不知道我知道这意味着什么。超类永远不会意识到它们的子类。 – 2012-02-04 00:16:49

0

我有一个UIViewController A和B.那的一个子类如果我有一个和 我想打电话给B的方法,它覆盖A,我该怎么做呢?

您只需调用该方法。如果该对象实际上是B的一个实例,那么该方法的B版本将被执行。如果该对象被实例化为A的一个实例,则将调用该方法的A版本。尝试一下为自己真正了解它:

@interface A : NSObject 
{} 
@end 

@implementation A 
- (void)whoAmI 
{ 
    NSLog(@"I'm an A\n); 
} 
@end 

@interface B : A 
@end 

@implementation B 
- (void)whoAmI 
{ 
    NSLog(@"I'm a B\n"); 
} 
@end 

//... 
A *a = [[A alloc] init]; 
A *b = [[B alloc] init]; 
B *c = [[A alloc] init]; 
B *d = [[B alloc] init]; 

[a whoAmI]; // this will log "I'm an A" 
[b whoAmI]; // this will log "I'm a B" 
[c whoAmI]; // this will log "I'm an A" 
[d whoAmI]; // this will log "I'm a B" 

在子类中的实现,可以通过使用关键字super代替self调用父类的方法。例如,B的另一种方法可以称之为B的-whoAmI这样的:

[self whoAmI]; 

,或者它可以调用它的父类的实现是这样的:

[super whoAmI]; 

这是在同一个方法的覆盖最有用,所以你可以保留继承的行为,但添加到它。 B的-whoAmI可以实现这样的:

- (void)whoAmI 
{ 
    NSLog(@"I'm a B\n"); 
    [super whoAmI]; 
} 

在这种情况下,该片段上方将不得不在评论中所示的结果:

[a whoAmI]; // this will log "I'm an A" 
[b whoAmI]; // this will log "I'm a B" followed by "I'm an A" 
[c whoAmI]; // this will log "I'm an A" 
[d whoAmI]; // this will log "I'm a B" followed by "I'm an A" 

真正了解这个东西,因为它是从根本上理解如何是很重要的与不同类型的对象一起工作。所以花一些时间写这样的傻小示例程序,并不断提问,直到你确定你已经得到它。