0

我有三个班级Class A, Cl ​​ass BCl​​ass C

A类声明一个协议如下

@protocol calculate <NSObject>

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

@end

在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

4

3 回答 3

1

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

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

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

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

于 2013-10-10T22:33:51.267 回答
0

为什么要在 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; }

于 2013-10-10T22:33:37.963 回答
0

检查代表的班级。

[[delegate class] isKindOfClass:[B class]]
于 2013-10-10T22:37:10.040 回答