【问题标题】:What is the difference between method overloading and method overriding Ios方法重载和方法覆盖Ios有什么区别
【发布时间】:2015-10-27 11:11:04
【问题描述】:

我是 IOS 新手,谁能告诉 IOS 中的方法重载和覆盖之间有什么区别。我已经经历过这个,但它是 java,我想知道 IOS 也一样(目标 c 或 swift,如果可能的话,用一些代码)

What is the difference between method overloading and overriding?

【问题讨论】:

    标签: ios objective-c swift overloading overriding


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

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

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

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

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

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

    7. 在方法重载的情况下方法的返回类型无关紧要,它可以相同或不同。但是,在方法覆盖的情况下,覆盖方法可以具有更具体的返回类型 (refer this)。

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

    9. 重载不需要继承。

    【讨论】:

    • 非常感谢您分享这个。详细解释
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

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

      显然,关于重载有很多困惑。让我们从斯威夫特开始。在 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) {
         ...
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 什么是objective-c或swift中不存在的概念?您可以在一个类中清楚地实现 func a(a:int) 和 func a(b:String) 。这不被认为是超载吗?
        • @Animal Obj-C 在方法之间的区别在于名称而不是类型。没有超载。在 Swift 中,你绝对可以超载。
        • 我想说这只是 obj-c 中的一个术语,它本质上也在那里重载。但我明白你的意思
        • 我的错,Sulthan 是对的。但是你绝对不能在 obj-c 中重载。我编辑了我的答案。最重要的是,它的定义不会因语言而异。
        猜你喜欢
        • 2012-09-04
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 1970-01-01
        相关资源
        最近更新 更多