Iphone 作为函数参数的不同类型对象

Iphone 作为函数参数的不同类型对象,iphone,Iphone,我从NSObject创建了2个对象子类 对象,对象 是否可以将这两个对象的变量转换为同一个函数 比如 -(void)myFunction:(AObject *)obj; -(void)myFunction:(BObject *)obj; 我在xcode中测试过,这是不允许的。 有什么替代方法吗 欢迎评论 谢谢 interdev有几个选项。下面是我想到的四种,每种都有各自的优点和缺点: 签名歧视: - (void)myFunctionWithA:(AObject *)obj; - (void)

我从NSObject创建了2个对象子类

对象,对象

是否可以将这两个对象的变量转换为同一个函数

比如

-(void)myFunction:(AObject *)obj;

-(void)myFunction:(BObject *)obj;
我在xcode中测试过,这是不允许的。 有什么替代方法吗

欢迎评论

谢谢
interdev有几个选项。下面是我想到的四种,每种都有各自的优点和缺点:

  • 签名歧视:

    - (void)myFunctionWithA:(AObject *)obj;
    - (void)myFunctionWithB:(BObject *)obj;
    
  • 声明类型为
    NSObject*
    (或
    id
    ,如注释所示)的参数,并在函数内查询该类型

  • 如上所述,但通过声明一个公共基类来约束它,
    BaseObject*
    ,从中继承
    aoobject
    boobject
  • 将基础课与蹦床技术相结合:

    - (void)myFunction:(BaseObject *)base {
        [base myTrampoline:self];
    }
    
    BaseObject
    声明了抽象方法
    myTrampoline:
    ,该方法由
    AObject
    BObject
    实现


  • 如果不了解问题的更多信息,就不可能说哪一个是最好的。

    有人建议只键入参数作为
    id
    ,但如果您感觉很棒,您可以强制执行编译时检查,以确保您的对象能够真正执行您需要的操作:使用协议

    @protocol DoingSomething <NSObject>
    // whatever methods you intend to call on the parameter of that one method
    @end
    
    //...
    - (void)myFunction:(id<DoingSomething>)param {
        // only send messages to param that are in <DoingSomething> and <NSObject>
    }
    //...
    
    @协议正在做一些事情
    //无论您打算对该方法的参数调用什么方法
    @结束
    //...
    -(void)myFunction:(id)参数{
    //仅向和中的参数发送消息
    }
    //...
    
    @gcamp我不同意。特别是因为并非所有Objective-C对象都是
    NSObject*
    (有些对象也是
    NSProxy*
    ,尽管这相对较少)。而
    id
    struct objc_object*
    的同义词,适用于任何对象。不过这并不重要。@gcamp,@乔纳森:谢谢你的建议。