2

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

问题是,我有几个课程:Show, Segment, Command. 这三个类完全不同,除了一件事:它们都有一个NSArray被调用的schedules,其中包含ScheduleItem类。

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

有一个很好的方法吗?

要记住,除了 schedules 数组之外,这些类绝对没有任何共同点。所以,我想避免子类化。但你可以用其他方式说服我。

4

2 回答 2

1

你可以像这样创建

@interface ScheduleCollection : NSObject {
    NSArray* schedules;
}

@property NSArray* schedules;

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

@end

然后将 Show、Segment、Command 中的 schedules 数组替换为该类的 ivar。如果您需要比较时间,只需获取属性并调用匹配:

Show* show = ...;

BOOL m = [show.schedules match: my_time];
于 2012-10-23T21:50:23.970 回答
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>
}

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

于 2012-10-24T06:33:46.960 回答