特定の基準が満たされたときに各「具体的な」クラスがより具体的なインスタンスを返すことができるように、「マルチレベル」のクラスクラスターを作成したいと思います。
たとえば、基本クラスでは次のようになります。
@interface BaseClass : NSObject // this is the public API of the service
+(instancetype)initWithData:(Data *)data;
// common interface of all the specific implementations..
...
...
@end
@implementation BaseClass
// basically implementing the "cluster"
+(instancetype)initWithData:(Data *)data {
// testing some conditions to decide on the more specific version of the class to return...
if (data.condition == condition1) {
return [[SomeClassOne alloc] initWithData:data];
}
if(data.condition == condition2) {
return [[SomeClassTwo alloc] initWithData:data];
}
...
// have many types which could be returned
}
// an example of a specific instance that should be returned from the cluster - all of these classes are "private" implementations of the base class
@implementation SomeClassOne
-(instancetype)initWithData:(Data *)data {
self = [super initWithData:data];
// all was good until a new optimization came about...
// now this instance can refine the class cluster even better
// what I would want is a way to do:
self = [[SomeClassOne_EvenBetterVersion alloc] initWithData:data];
// but this would be bad - and would cause recursion if the new version inherits this version...
}
@end
基本クラスに新しい条件 (大きな "if" ステートメント) を常に追加したくありません。これは、条件が具体的なクラスに非常に固有のものになるためです。ほとんどの場合、新しい機能に関係する最適化です。
これにはより良いパターンがありますか?
各サブクラスで追加のチェックを行うクラスメソッドを作成することを考えましたが、これは各サブクラスで [Subclass initWithData:data] を呼び出す必要があるため、非常に面倒です。