使用Obj-C中的特定方法“装饰”几个类

时间:2012-10-23 21:37:35

标签: objective-c design-patterns

我还没有进入设计模式,所以“抱歉!”用这样的问题打扰你,这可能是显而易见的。

问题是,我有几个课程:ShowSegmentCommand。这三个类完全不同,除了一件事:它们都有一个名为NSArray的{​​{1}},其中包含schedules个类。

在我的工作流程中,我需要检查当前时间是否与scheduleItem匹配,以设置ScheduleItemShowSegment有效。所以,我想在所有这三个类Command上有一个方法。由于此方法对所有当前和未来的类执行相同操作,因此我正在寻找一种方法来实现isActive()方法一次,并在这些类中重用它。

这样做有什么好办法吗?

要记住,除了scheduleles数组之外,这些类绝对没有任何共同之处。所以,我想避免子类化。但你可以说服我。

2 个答案:

答案 0 :(得分:1)

你可以像这样创建smth

@interface ScheduleCollection : NSObject {
    NSArray* schedules;
}

@property NSArray* schedules;

/**
  Return true if matches.
*/
-(BOOL) match:(ScheduleSclass); //or call it isActive or whatever you like 

@end

然后使用此类的ivar替换Show,Segment,Command中的scheduleles数组。如果您需要比较时间,只需获取属性并致电匹配:

Show* show = ...;

BOOL m = [show.schedules match: my_time];

答案 1 :(得分:1)

除了通用继承(使用该方法的共享基类)之外,实际上没有设计模式。您不能将它作为所有三个类别添加,因为它们不共享基类。

如果要避免引入基类,可以使用类型id是无类型对象的事实,并且可以在运行时调用其上的任何方法。只有当实际目标没有方法时才会失败...

在每个对象上,创建一个名为getSchedule的方法,如下所示:

- (NSArray*) getSchedule {
  return schedule;
}

然后在其他地方创建此方法

-(BOOL) isActive:(id)anyObjectWithGetScheduleAnyOtherWillFailWithSelectorNotImplemented
{
  // You could do an explicit check to determine if the object passed in implements
  // getSchedule, but I skipped it here.
  NSArray* schedule =  [anyObjectWithGetScheduleAnyOtherWillFailWithSelectorNotImplemented getSchedule];
  <your implementation here>
}

在我看来,你最好只引入一个共享的基类,因为它更清晰,并且不会真正花费更多的工作。但是如果你有充分的理由不这样做,那也可以做到这一点。