我是IOS的新手,任何人都可以告诉IOS中方法重载和覆盖之间有什么区别。我已经完成了这个但是它是java,我想知道IOS的相同(目标c或者快速,如果可能的话用一些代码)
What is the difference between method overloading and overriding?
答案 0 :(得分:17)
重载发生在编译时,而重载发生在运行时:重载方法调用与其定义的绑定在编译时发生,但重写方法调用绑定到其定义发生在运行时。
静态方法可以重载,这意味着一个类可以有多个同名的静态方法。即使在子类中声明相同的静态方法,它也无法覆盖静态方法,它与父类的相同方法无关。
最基本的区别是重载是在同一个类中完成的,而重写基类和子类是必需的。重写是关于为父类的继承方法提供特定实现。
静态绑定用于重载方法,动态绑定用于重写/覆盖方法。
性能:与覆盖相比,重载提供了更好的性能。原因是重写方法的绑定正在运行时完成。
私有和最终方法可以重载,但不能覆盖它们。这意味着一个类可以有多个具有相同名称的私有/最终方法,但子类不能覆盖其基类的私有/最终方法。
方法重载时方法的返回类型无关紧要,可以相同也可以不同。但是,如果方法覆盖,则覆盖方法可以具有更具体的返回类型(refer this)。
进行方法重载时,参数列表应该不同。方法Overriding中的参数列表应该相同。
在重载时,覆盖需要继承。
答案 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中不存在。 方法覆盖在所有语言中都是相同的概念。