2012-04-05 24 views
0

私はベースクラスMyDeviceを持っています。また、私は、基本クラスMyDeviceControllerを持っている:Objective-Cプロパティ/継承/デザインアドバイス

@interface MyDeviceController : NSObject { 
    MyDevice* device; 
} 

@property (retain) MyDevice* device; 

@end 

MyDeviceControllerは、私はサブクラスで残しておきたいデバイスのセッターではいくつかの共通のロジックを持っています。

私はMYDEVICEの2つのサブクラスがありますMyDeviceController

@interface MyAudioDevice : MyDevice 

- (void)audioMethod; 

@end 

@interface MyVideoDevice : MyDevice 

- (void)videoMethod; 

@end 

そして、2つのサブクラス:MyVideoDeviceControllerMyAudioDeviceControllerdeviceプロパティとしてMyVideoDeviceMyAudioDeviceを持っている必要があります。

MyDeviceControllerのこの2つのサブクラスを実装する最良の方法は何ですか?あるいは、そのような場合にはいくつかのパターンがあるかもしれませんか?

@interface MyAudioDeviceController : MyDeviceController 

@property (retain) MyAudioDevice* device; 

@end 

と実装で

@implementation MyAudioDeviceController 

- (void)setDevice:(MyAudioDevice*)device 
{ 
    NSAssert([device isKindOfClass:[MyAudioDevice class]], @"What's the...?"); 
    [super setDevice:device]; 
} 

- (MyAudioDevice*)device 
{ 
    return (MyAudioDevice*)[super device]; 
} 

@end 

私は、このソリューションには好きではない唯一のもの:

は、私が最初に見つかったソリューションがMy[Audio|Video]DeviceControllerでプロパティを再宣言することです

を更新しましたdeviceメソッドの再定義です。

他にも解決策がありますか?

+0

コントローラは、任意のタイプのデバイスを受け入れることができるようmydeviceにするためのインターフェース(Iは、Objective-Cであっ呼ば忘れ)(S)と、そのプログラムを使用します。 –

+0

@TomIngram:プロトコルは – dreamlax

答えて

0

コントローラ

@interface AudioDevice : NSObject <MediaDevice> 
@end 

@implementation AudioDevice 
- void play 
{ 
    [super play] 
} 
// ... 
@end 

@protocol MediaDevice 
- void play 
- void stop 
- void pause 
@end 

実装

ように私は私が最善の解決策を見つけたと思います。解決方法は、 deviceプロパティの実装に @dynamic指示を使用することです。

@interface MyAudioDeviceController : MyDeviceController 

@property (retain) MyAudioDevice* device; 

@end 

と実装:

@implementation MyAudioDeviceController 

@dynamic device; 

- (void)setDevice:(MyAudioDevice*)device 
{ 
    NSAssert([device isKindOfClass:[MyAudioDevice class]], @"What's the...?"); 
    [super setDevice:device]; 
} 

- (void)someAduioDeviceControllerMethod 
{ 
    [self.device audioMethod]; 
} 

@end 
0

-(void)setDevice:(Device *)deviceをコントローラに書き換えて、MyVideoDeviceまたはMyAudioDeviceのみを受け入れるようにしてください。一般的なコントローラからロジックが必要な場合は、単にそれをコピーします。

+0

の後ろにありますが、 'MyAudioDevice'を返すには' device'メソッドも必要です。重複したコードを避けるために '[super setDevice:device]'と呼んでいます。 質問を更新しました。 – Dmitry

0

私のobjective-cは少し離れていますが、うまくいけば、これは私のコメントで私が何を意味するかのアイデアを与えます。

"インタフェースを使用してください(私は目的-cで呼び出されたものを忘れてしまいます)、mydevice(s)にコントローラを接続して、コントローラがあらゆるタイプのデバイスを受け入れることができます。

(理論上は)デバイスに重大なものはすべてプライベートであり、共通のインターフェイスを使用するので、多くの異なるコンクリートデバイスを持つことができ、心配する必要はありません。

インターフェースなど

@interface DeviceController : NSObject 
@property (readwrite, assign) MediaDevice device 
@end 
+0

私はデバイスごとに異なるメソッドを持っています: 'MyVideoDevice'の' videoMethod'と 'MyAudioDevice'の' audioMethod'は、 'MyDevice'ではなく、' MyAudioDeviceController'で 'device'を' MyAudioDevice'として使う必要があるのです。 – Dmitry

関連する問題