私たちは実装のプロトコルを持つことができますか?

私はsingletonProtocolを設定したい。そのプロトコルを実装するクラスは、+(id)シングルトン

明らかに、私はそのシングルトンメソッドを実装します。同じことを何度も繰り返すことは無駄です。

I can use inheritance, I already knows how to do it, but a class can only have one parent and using inheritance sounds like an overkill. Basically I will just store the singletons in an NSMutableDictionary whose key is the NSStringFromClass of the respective class. I wonder why no one else do that. It's the same technique I used for Inobjective-chow can we have a variable whose scope is the whole class (but doesn't include subclasses)

#import "BGSuperSingleton.h"

static NSMutableDictionary * allTheSingletons;
@implementation BGSuperSingleton

+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    id result = allTheSingletons[className];

    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
    }
    return result;
}

@end

私はカテゴリーを使うことができます。ただし、カテゴリは事実上すべてのクラスで機能します。私はすべての私のシングルトンがスーパーシングルトンクラスに属することを制限することができますが、それは目的を破るでしょう

私はプロトコルを使うことができます。今は素晴らしいです。しかし、プロトコルには実装がありません。プロトコルは、クラスが行うことができるメソッドのみを宣言します。

では、私はどうしたらいいですか?

3
nl ru de

1 答え

どうすればいいですか?

あなたのデザインを再考する必要があります。あなたはこれらのクラスのそれぞれの共有インスタンスを持つことができるように、このプロトコルをいくつかの異なるクラスで採用したいと思うようです。それらのオブジェクトはシングルトンである必要がありますか必要があります?共有オブジェクトと、 は一度もインスタンス化されてはならないクラスの違いがあります。

他のすべてのクラスのファクトリとして動作するクラスを作成することを検討してください。そのクラスは共有オブジェクトの辞書を保持することができ、他のクラスをインスタンス化するために常にファクトリを使用するというポイントを作ることができます。実際には、他のクラスを記述することで、それらのインスタンスを直接インスタンス化すると例外をスローすることができます。

3
追加された
それはもう一つのアプローチだろう。効果的にトン数のシングルトンを持つクラス。
追加された 著者 Sharen Eayrs,