0

基本クラスがありMyDeviceます。また、基本クラスがありMyDeviceControllerます:

@interface MyDeviceController : NSObject {
    MyDevice* device;
}

@property (retain) MyDevice* device;

@end

MyDeviceController には、サブクラスに保持したいデバイスのセッターにいくつかの共通ロジックがあります。

MyDevice の 2 つのサブクラスがあります。

@interface MyAudioDevice : MyDevice

- (void)audioMethod;

@end

@interface MyVideoDevice : MyDevice

- (void)videoMethod;

@end

MyDeviceController: MyVideoDeviceControllerandの 2 つのサブクラスは、プロパティとしてandMyAudioDeviceControllerを持つ必要があります。MyVideoDeviceMyAudioDevicedevice

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

更新しました

私が見つけた最初の解決策は、次のプロパティを再宣言することですMy[Audio|Video]DeviceController

@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

このソリューションで唯一気に入らないのは、deviceメソッドの再定義です。

別の解決策があるかもしれませんか?

4

3 に答える 3

0

私のObjective-cは少しずれていますが、うまくいけば、これは私のコメントで私が何を意味するのかをあなたに理解させるでしょう。

「mydevice(s)にインターフェース(objective-cで呼ばれているものを忘れています)を使用し、それにプログラムして、コントローラーが任意のタイプのデバイスを受け入れることができるようにします。」

理論的には、デバイスにとって重要なものはすべてプライベートである必要があり、共通のインターフェイスを使用するため、さまざまな具体的なデバイスを使用でき、心配する必要はありません。

次のようなインターフェース

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

実装

@interface AudioDevice : NSObject <MediaDevice> 
@end

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

コントローラ

@interface DeviceController : NSObject
@property (readwrite, assign) MediaDevice device
@end
于 2012-04-05T13:19:41.370 に答える
0

私は最善の解決策を見つけたと思います。@dynamic解決策は、プロパティの実装でディレクティブを使用することdeviceです。

@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
于 2012-04-06T07:37:23.187 に答える
0

または-(void)setDevice:(Device *)deviceのみを受け入れるようにコントローラーを書き直してください。ジェネラル コントローラーからのロジックが必要な場合は、それをコピーするだけです。MyVideoDeviceMyAudioDevice

于 2012-04-05T13:15:33.103 に答える