【问题标题】:Delegating to the correct method of the same name [closed]委托给同名的正确方法[关闭]
【发布时间】:2013-10-10 22:24:03
【问题描述】:

我有三个班级A 类B 类C 类

A类声明如下协议

@protocol calculate <NSObject>

@required
-(void)addNumbers;
-(void)calculateTotal;

@end

Class A 的实现中,我已经定义了一个属性。

static id <calculate> delegate;

] B 类C 类 实现了其中定义的协议和方法。

在 A 类的实现文件中,如果我想调用 B 类和 C 类实现的正确协议方法,我正在执行以下操作

 id <calculate> delegate = [Class B alloc] init];
 [delegate addNumbers];

 id <calculate> delgate = [Class C alloc] init];
 [delegate addNumbers];

尽管这可行,但我觉得这是不对的。我想知道单个委托对象是否有可能在 B 类或 C 类上确定并调用正确的 addNumbers

【问题讨论】:

  • 我从未见过静态委托。
  • 对于 C 类,您的意思是 [anotherDelegate addNumbers];?是复制粘贴错误,还是?
  • 顺便说一句:您正在调用委托和另一个委托属性。但他们不是。
  • 由于目标 c 是一种“动态”类型语言,所以我认为您只需将对象(B 类或 C 类对象)分配给委托,运行时将通过查看对象自动调用该方法.

标签: ios iphone objective-c delegates protocols


【解决方案1】:

我建议将协议放入自己的文件中。然后 A 类导入该文件并声明对它的支持“@interface Class_A : NSObject(也请大写“C”)。

通常,委托将是一个预先存在的对象。为新对象创建它是没有意义的,因为协议的整个想法是能够在无需了解现有对象的情况下向现有对象发送消息。

因此,当您创建 B 和 C 时,您将它们的委托属性(使用 __weak)设置为某个符合协议的现有对象。然后,这些新对象可以向该对象发送消息。

因此,假设您正在制作一个计算器,并且您希望一个代表来处理计算。很好 - 比如说 UIViewController,创建这个可以做到这一点的对象,并保持对它的强引用。然后,当您创建需要委托来进行计算的按钮时,您可以使用之前创建的这个对象来设置它们的委托属性

【讨论】:

    【解决方案2】:

    检查委托的类。

    [[delegate class] isKindOfClass:[B class]]
    

    【讨论】:

      【解决方案3】:

      你为什么在A类中分配B类和C类。

      在A类中它应该调用委托方法[self.delegate addNumbers] 并且不需要引用实现它的类。

      B 类和 C 类应该各自有自己的 -(void)addNumbers; 实现

      ClassC.m -(void)addNumbers{ c = a+b; }

      ClassB.m -(void)addNumbers{ c = a+b+d+1; }

      【讨论】:

      • 我能否要求澄清一下这背后的原因。在您的情况下可能值得实施块。拥有一个需要同时调用两个实现的协议似乎很奇怪。
      • @Unheilig 我有一些 Java 知识。总的来说,我对编程还是很陌生
      猜你喜欢
      • 2012-10-20
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多