类和继承类中定义的方法

时间:2014-02-20 07:36:32

标签: objective-c oop inheritance polymorphism

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

示例:

假设我有一个父类Super和一个子类Sub。它们都实现了方法Match。现在在另一个班级,比如说OtherClass,我定义了

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

我在Match

中调用方法OtherClass
[super Match]

Match中的Super会被调用,Match中的Sub会被调用吗?

5 个答案:

答案 0 :(得分: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 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Here你可以看到它的表现。这个主题在前面的SO

中讨论过

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

答案 4 :(得分:-1)

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

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

即使objA是A类,它也指向B类的对象。因此,在实现B时将调用someMethod。