在objective-c中,如果在该类的类和继承类中定义了一个方法,并且我从另一个类调用该方法,我的编译器将如何知道要选择哪个方法?父类中的原始方法或继承类中的override方法。在我的代码中,我通过父类调用方法名称,但编译器正在继承类中的方法。
示例:
假设我有一个父类Super
和一个子类Sub
。它们都实现了方法Match
。现在在另一个班级,比如说OtherClass
,我定义了
Super *super = [[Super alloc]init];
我在Match
OtherClass
[super Match]
Match
中的Super
会被调用,Match
中的Sub
会被调用吗?
答案 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)
这是Inheritance
和Polymorphism
的核心行为。编译器将始终选择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。