Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在类和继承类中定义的方法_Objective C_Oop_Inheritance_Polymorphism - Fatal编程技术网

Objective c 在类和继承类中定义的方法

Objective c 在类和继承类中定义的方法,objective-c,oop,inheritance,polymorphism,Objective C,Oop,Inheritance,Polymorphism,在objective-c中,如果在该类的类和继承类中都定义了一个方法,并且我从另一个类调用该方法,那么我的编译器如何知道选择哪个方法?父类中的原始方法或继承类中的重写方法。在我的代码中,我通过父类调用方法名,但编译器在继承的类中拾取方法 例如: 假设我有一个父类Super和一个子类sub。它们都实现了方法Match。现在在另一个类中,比如说OtherClass,我定义 Super *super = [[Super alloc]init]; 我在OtherClass [super Match]

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

例如:

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

Super *super = [[Super alloc]init];
我在
OtherClass

[super Match]

将调用
Super
中的
Match
还是调用
Sub
中的
Match
呢?

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

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

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

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

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

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

这是
继承
多态性
的核心行为。编译器将始终在继承的
类中选择方法。通过这种方式,您可以获得行为
多态性
。使用
多态性的概念
,您可以高效地设计一个符合类设计原则标准(如原则)的类。

这是
继承
多态性
的核心行为。编译器将始终在继承的
类中选择方法。通过这种方式,您可以获得行为
多态性
。使用
多态性的概念
,您可以高效地设计一个符合类设计原则标准(如原则)的类。

您可以看到它的行为。这个话题在前面讨论过,所以

如果要从超类调用同一方法,则必须明确说明,否则将从子类或子类调用该方法

你可以看到它的行为。这个话题在前面讨论过,所以


如果要从超类调用同一方法,则必须明确说明,否则将从子类或子类调用该方法

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


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

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


您可能正在使用超类类型的变量,但这并不重要-变量的类型只是用于静态类型检查。方法分派是基于对象本身的类完成的。变量允许引用它们声明的类型的子类,所以类型检查器不会标记为错误。C++中的所有实例方法都是“虚”的。p> 例如,如果您有两个类

@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 

编译器总是调用你继承的类的方法。在.b>中,所有实例方法都是“虚”的,例如C++。p> 例如,如果您有两个类

@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 

在您的情况下,编译器将始终调用继承类的方法。

所以,如果我有两个继承类,并且都重写父类中的同一方法,该怎么办?编译器将如何确定调用哪个方法?说它将“始终选择继承类的方法”并不十分准确。它将选择消息发送到的对象的类的方法。它可以是子类,也可以是超类。@azmuhak您将拥有一个基类实例,您将为其分配所需派生类的实例。所以,在赋值之后,您可以通过基类的实例调用该方法,但是您分配给它的派生类实例的方法将被执行。那么,如果我有两个继承类,并且都重写父类中的同一个方法,该怎么办?编译器将如何确定调用哪个方法?说它将“始终选择继承类的方法”并不十分准确。它将选择消息发送到的对象的类的方法。它可以是子类,也可以是超类。@azmuhak您将拥有一个基类实例,您将为其分配所需派生类的实例。因此,在赋值之后,您可以通过基类的实例调用该方法,但是您分配给它的派生类实例的方法将执行。我不完全理解你在答复中所作的解释。我在问题中增加了一些细节,使我的困惑更加清楚。谢谢,我正在使用我的超类中的对象。我不完全理解你在答复中所作的解释。我在问题中增加了一些细节,使我的困惑更加清楚。Thanks@MykolaDenysyuk:我不是向下投票人,但“它将始终调用继承类中的方法”这句话有点过分了。这可能就是原因