2012-01-13 9 views
4

私はプロトコルを定義して、そのプロトコルのシングルトンスタイルの「デフォルト」共有実装を取得する簡単で標準的な方法を作成したいと考えています。次のパターンにココアが付着さん: Cocoaシングルトンとプロトコル

[NSUserDefaults standardUserDefaults] 
[NSNotificationCenter defaultCenter] 

が、両方のケースで

、彼らはオブジェクト階層の最下部には@interfaceを持っています。 @protocolsを使ってこれを行う方法に苦労しています。私は明らかに空または単純なメソッドの実装を持つクラスを作成することができます - しかし、実際には、私が望むものは、階層の最下部に@プロトコルです。私のような何か試してみた:

@protocol ConfigurationManager <NSObject> 

//... 

@interface ConfigurationManagerFactory : NSObject 

+ (id<ConfigurationManager>)sharedConfiguration; 

@end 

// ... 

id<ConfigurationManger> config = [ConfigurationManagerFactory sharedConfiguration]; 
[config ...]; 

をし、それが動作します - しかし、私はいつもこれを使用する方法を説明した、なぜ私はこのようにそれをやったんです。 @protocolsの価値を引き続き活用しながら、Cocoaの構文(呼び出し規約)に準拠する方法はありますか?

私はこのような@protocolsを使用したくない理由は何ですか?実装している@interfaceは、NSStringを拡張してNSStringを拡張するクラスを通常どのようにインスタンス化するかのように、カテゴリや代替実装などを活用することができます。

答えて

1

はアイデアだ:あなたのプロトコルのデフォルト実装を返すファクトリメソッドと同じ名前を使用してプロトコルとクラスを作成します。

@protocol ConfigurationManager <NSObject> ... 

@interface ConfigurationManager : NSObject <ConfigurationManager> 
+(ConfigurationManager *) defaultConfigurationManager; 
... 

その他の特別な実装は、お使いのベースを継承することができますクラス。

+0

ああ - 私は名前の衝突を作成すると思った!私はそれが私が必要としているものだと思う! TY。 –

2

プロトコルの全ポイントは、実装を提供するのないインターフェイスを指定することです。デフォルトの実装をしたい場合は、NSObjectクラスがNSObjectプロトコルを実装するのと同じように、あなたのプロトコルを実装するクラスを提供してください。次に、クライアントは、指定したクラスをサブクラス化するか、提供するクラスをインスタンス化し、結果オブジェクトの実装を使用します(configオブジェクトと同様)。ここで

+0

必ずしも実装を提供したくないので、私はプロトコルが必要です。私が必要とするのは、デフォルト、シンプル、または標準の実装を、Cocoaがそれを行う方法と構文的に一致するシングルトンとして公開する方法です(WWCD :)名前が同一である可能性があるということでした。あなたのNSObjectの例は頭の爪に当たります - それは私が探していたものです!ヨルダンはそれをもう少し直接的に言いますが、それは私を同じ場所に連れて来ます。 –

+1

なぜシングルトンですか?シングルトンは単なる共有オブジェクトではなく、インスタンス化できるクラスです(http://en.wikipedia.org/wiki/Singleton_pattern)。これまで読んだことは、プロトコルを実装するオブジェクトを作成する簡単な方法を探しているだけです。必要に応じて便利なメソッドを作成することができますが、シングルトンを作成することは、あなたが私たちに語ったことを考えると不要に見えます。私はあなたが共有オブジェクトを必要とすることさえも確信していません。 – Caleb

関連する問題