2014-02-20 33 views
0

在objective-c中,如果方法在该类的类和继承类中定义,并且我从另一个类调用该方法,那么编译器将如何知道要选择哪种方法?父类中的原始方法或继承类中的重写方法。在我的代码中,我通过父类调用方法名称,但编译器正在继承类中拾取方法。在类和继承类中定义的方法

例子:

可以说我有一个父类Super和子类Sub。他们两人实施方法Match。现在,在另一个类,说OtherClass,我定义

Super *super = [[Super alloc]init]; 

和我打电话的方法MatchOtherClass

[super Match] 

将在SuperMatch被称为或SubMatch被称为?

+0

您对其中一个答案满意吗?你确定你在两个类中都有相同的方法签名吗? – Avt

+0

是的。我在这两个类中都有相同的方法签名。这个问题是我在我编辑的问题中提到的,因为没有使用我的子类对象调用我的方法,而是使用我的超类对象,被调用的方法是子类。如果你可以阐明为什么会发生这种情况,那会很好。 – azmuhak

+0

这里'[[Super alloc] init]'你正在创建超级对象。所以'Super'中的'Match'将被调用。 – Avt

回答

3

在Objective C中,所有实例方法都是以C++为例的“虚拟”。

例如,如果你有2个班

@interface A 
- (void)doSomething; 
@end; 

@interface B : A 
- (void)doSomething; 
- (void)doSomethingB; 
@end; 

你要给

A *a = [A new]; 
B *b = [B new]; 

[(B*)a doSomething]; // method from A is called 
[(A*)b doSomething]; // method from B is called 

[a doSomethingB]; // compile error. No such method for A 
[(A*)b doSomethingB]; // compile error. No such method for A 
[(B*)a doSomethingB]; // compiles, but runtime exception. Undefined method for A 

编译器总是调用继承类的方法,你的情况。

-1

它将始终调用继承类中的方法。如果类A是基类,B是继承的类,tehn

B *objB = [[B alloc] init]; 
A *objA = (objA *)B; 
[objA someMethod]; 

即使objA是类型A的,它指向类B的一个目的因此会的someMethod上的执行被称为B.

+1

为什么减去,当答案**是正确的**? –

+0

@MykolaDenysyuk:我不是downvoter,但声明“它总是会调用继承类中的方法”有点过分。这可能是为什么。 – Chuck

+1

@Chuck但据此质疑,这是最直接的答案。此外,它总是会从继承类开始寻找方法选择器,不是吗? –

0

这是InheritancePolymorphism的核心行为。编译器将始终选取inherited类中的方法。通过这种方式,您可以获得polymorphism的行为。使用polymorphism的概念,您可以高效地设计符合类设计原则标准的类,例如SOLID原则。

+0

那么,如果我有两个继承的类,并且都覆盖父类中的相同方法呢?编译器如何确定要调用哪种方法? – azmuhak

+1

说“它总是选择继承类的方法”并不太准确。它将选择消息发送到的对象的类的方法。这可能是子类,也可能是超类。 – Chuck

+0

@Chuck你是对的。 –

0

Here你可以看到它会如何表现。 SO

您将不得不明确提及是否要从超类中调用相同的方法,否则将从子类或子类调用它。

2

它将调用该方法的对象是什么类。你显然有一个子类的实例,所以你得到了子类的实现。

您可能正在使用超类型的变量,但这并不重要 - 变量的类型仅用于静态类型检查。方法调度是基于对象本身的类来完成的。允许变量引用其声明类型的子类,因此类型检查器不会将其标记为错误。

+0

我正在使用我的SuperClass中的对象。我不完全理解你在答案中给出的解释。我在我的问题中添加了一些细节,使我的困惑更清晰。谢谢 – azmuhak