【问题标题】:Function Overloading in Objective-C?Objective-C 中的函数重载?
【发布时间】:2017-09-27 12:43:01
【问题描述】:

根据我的理解,C 专家 Objective-C 是一种动态绑定语言,不允许重载类中的任何方法。

但是如果我编写两个具有相同名称但参数列表数量不同的方法,例如:

 // Which is not allowed in objective-c

 -(void)updateValue:(int)intVal{

  } 

 -(void)updateValue:(float)floatVal{

  }

但Objective-C允许的第二种情况是:

 // Allowed in Objective-C

 -(void)updateValue:(int)intVal{

   }

 -(void)updateValue:(float)floatVal :(int)intVal{

   }

虽然这两种情况都是方法重载。

现在我的问题是为什么允许第二种情况。

第二种情况下具有两个参数的方法是否更改了方法名称?还是别的什么?

请解释一下。

【问题讨论】:

  • 永远不要写-(void)updateValue:(float)floatVal :(int)intVal。至少,写-(void)updateValue:(float)floatVal andSomething:(int)intVal。否则,签名为-updateValue:-updateValue::(无参数介绍时)、-updateValue:andSomething:

标签: ios objective-c overloading dynamic-binding


【解决方案1】:

第二种情况下具有两个参数的方法是否更改了方法名称?

是的。方法名称是其所有参数前缀的组合,包括冒号。所以你的两种方法是updateValue:updateValue::

HTH

【讨论】:

    【解决方案2】:
    -(void)updateValue:(int)intVal
      {
      } 
    
     -(void)updateValue:(float)floatVal
      {
      }
    

    这是不允许的,因为当用户使用参数调用 updateValue 时,由于类型转换,值可能会改变,并且会显示模棱两可的方法。

     -(void)updateValue:(int)intVal
       {
       }
    
      -(void)updateValue:(float)floatVal :(int)intVal
      {
      }
    

    是允许的,因为参数计数不同,因此编译器知道要调用哪个方法,以及何时不是他们的模棱两可的方法调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多