2

私はまだデザインパターンに慣れていないので、「ごめんなさい!」そのような質問であなたを悩ませるために、それは明らかかもしれません.

問題は、私はいくつかのクラスを持っているということです: ShowSegmentCommand. これら 3 つのクラスは、1 つのことを除いて、まったく異なります。それらはすべて、クラスを含む、NSArray呼び出された を持っています。schedulesScheduleItem

私のワークフローでは、現在の時刻が scheduleItem と一致してShowSegmentまたはCommandアクティブに設定されているかどうかを確認する必要があります。したがって、これら 3 つのクラスすべてに というメソッドが必要isActive()です。isActiveこのメソッドは現在および将来のすべてのクラスで同じことを行うため、メソッドを一度だけ実装して、それらのクラスで再利用する方法を探しています。

これを行う良い方法はありますか?

これらのクラスには、スケジュール配列を除いて、まったく共通点がないことを覚えておいてください。したがって、サブクラス化は避けたいと思います。しかし、そうでなければ私を納得させることができます。

4

2 に答える 2

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

次に、Show、Segment、Commandのschedules配列をこのクラスのivarに置き換えます。時間を比較する必要がある場合は、プロパティを取得して一致を呼び出します。

Show* show = ...;

BOOL m = [show.schedules match: my_time];
于 2012-10-23T21:50:23.970 に答える
1

これには、ジェネリック継承 (メソッドとの共有基本クラス) を除いて、実際には設計パターンはありません。基本クラスを共有していないため、3 つすべてのカテゴリとして追加することはできません。

基本クラスの導入を避けたい場合は、型 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 に答える