方法重载和方法重写Ios之间有什么区别

时间:2015-10-27 11:11:05

标签: ios objective-c swift overloading method-overriding

我是IOS的新手,任何人都可以告诉IOS中方法重载和覆盖之间有什么区别。我已经完成了这个但是它是java,我想知道IOS的相同(目标c或者快速,如果可能的话用一些代码)

What is the difference between method overloading and overriding?

4 个答案:

答案 0 :(得分:17)

  1. 重载发生在编译时,而重载发生在运行时:重载方法调用与其定义的绑定在编译时发生,但重写方法调用绑定到其定义发生在运行时

  2. 静态方法可以重载,这意味着一个类可以有多个同名的静态方法。即使在子类中声明相同的静态方法,它也无法覆盖静态方法,它与父类的相同方法无关。

  3. 最基本的区别是重载是在同一个类中完成的,而重写基类和子类是必需的。重写是关于为父类的继承方法提供特定实现。

  4. 静态绑定用于重载方法,动态绑定用于重写/覆盖方法。

  5. 性能:与覆盖相比,重载提供了更好的性能。原因是重写方法的绑定正在运行时完成。

  6. 私有和最终方法可以重载,但不能覆盖它们。这意味着一个类可以有多个具有相同名称的私有/最终方法,但子类不能覆盖其基类的私有/最终方法。

  7. 方法重载时方法的返回类型无关紧要,可以相同也可以不同。但是,如果方法覆盖,则覆盖方法可以具有更具体的返回类型(refer this)。

  8. 进行方法重载时,参数列表应该不同。方法Overriding中的参数列表应该相同。

  9. 在重载时,覆盖需要继承。

答案 1 :(得分:4)

ios中的方法重载:

objective-C不支持方法重载,因此您必须使用不同的方法名称。 但请注意,"方法名称"包括方法签名关键字(":"s之前的参数名称),所以以下是两种不同的方法,即使它们都开始" writeToFile":

-(void) writeToFile:(NSString *)path fromIntger:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

这两种方法的名称是" writeToFile:fromIntger:"和" writeToFile:fromString:"。

ios中的方法覆盖:

方法重写是一种语言功能,其中类可以提供已由其父类之一提供的方法的实现。此类中的实现替换(即覆盖)父类中的实现。

当您定义一个与父类名称相同的方法时,该新方法将替换继承的定义。新方法必须具有相同的返回类型,并采用与要覆盖的方法相同的参数数量和类型。

以下是一个例子:

@interface MyClass : NSObject

- (int)myNumber;

@end

@implementation MyClass : NSObject

- (int)myNumber {
    return 1;
}

@end

@interface MySubclass : MyClass

- (int)myNumber;

@end

@implementation MySubclass

- (int)myNumber {    
    return 2;    
}

@end

答案 2 :(得分:1)

Overjiding in Obj-C和Swift的工作方式与Java相同(在Swift中甚至用override关键字表示)。

显然,有关重载的问题很多。让我们从Swift开始吧。在Swift中,它通常以与Java相同的方式工作:

func myFunction(a: Int)
func myFunction(a: String)

相同的方法名称,接受不同的参数。编译器将根据参数的类型决定调用哪种方法。但是,添加其他参数时:

func myFunction(a: Int, b: Int)

方法名称实际上从myFunction(_:)更改为myFunction(_:b:)所以在传统意义上,这不应该被称为重载但我相信Swift只使用第一部分在某些情况下,名称(myFunction)区分方法,所以这实际上也可能是重载。我对这个案子有点不确定。

在Obj-C中,没有超载。

我们不能在Obj-C中声明以下内容:

@interface MyClass : NSObject

- (void)myMethod:(id)parameterA;
- (void)myMethod:(NSInteger)parameterA;

@end

当更改参数数量时,我们还必须更改方法名称

@interface MyClass : NSObject

- (void)myMethod:(id)parameterA;
- (void)myMethod:(NSInteger)parameterA withAnotherParam:(id)parameterB;

@end

请注意,方法名称分别为-myMethod:-myMethod:withAnotherParam:。当方法名称不同时,它不会重载。

然而,即使在Obj-C中,我们也可以使用普通的旧C函数,它们可以重载:

void functionA(int a) {
   ...
}

void functionA(int a, int b) {
   ...
}

答案 3 :(得分:-1)

方法重载是java或c ++中存在的概念,但在objective-c中不存在。 方法覆盖在所有语言中都是相同的概念。