我还没有进入设计模式,所以“抱歉!”用这样的问题打扰你,这可能是显而易见的。
问题是,我有几个课程:Show
,Segment
,Command
。这三个类完全不同,除了一件事:它们都有一个名为NSArray
的{{1}},其中包含schedules
个类。
在我的工作流程中,我需要检查当前时间是否与scheduleItem匹配,以设置ScheduleItem
,Show
或Segment
有效。所以,我想在所有这三个类Command
上有一个方法。由于此方法对所有当前和未来的类执行相同操作,因此我正在寻找一种方法来实现isActive()
方法一次,并在这些类中重用它。
这样做有什么好办法吗?
要记住,除了scheduleles数组之外,这些类绝对没有任何共同之处。所以,我想避免子类化。但你可以说服我。
答案 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>
}
在我看来,你最好只引入一个共享的基类,因为它更清晰,并且不会真正花费更多的工作。但是如果你有充分的理由不这样做,那也可以做到这一点。