0

我有一个基类MyDevice。我也有一个基类MyDeviceController

@interface MyDeviceController : NSObject {
    MyDevice* device;
}

@property (retain) MyDevice* device;

@end

MyDeviceController 在设备的设置器中有一些通用逻辑,我想保留在子类中。

我有 2 个 MyDevice 子类:

@interface MyAudioDevice : MyDevice

- (void)audioMethod;

@end

@interface MyVideoDevice : MyDevice

- (void)videoMethod;

@end

MyDeviceController以及:的两个子类,MyVideoDeviceController它们MyAudioDeviceController必须有一个MyVideoDeviceandMyAudioDevice作为device属性。

实现这两个 MyDeviceController 子类的最佳方法是什么?或者对于这种情况可能有一些模式?

更新

我找到的第一个解决方案是重新声明属性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

在你的控制器中重写-(void)setDevice:(Device *)device以确保它只接受MyVideoDeviceMyAudioDevice。如果您需要通用控制器的逻辑,只需将其复制过来。

于 2012-04-05T13:15:33.103 回答
0

我的 Objective-c 有点偏离,但希望这能让您了解我在评论中的意思。

“为我的设备使用一个接口(我忘记了在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

我想我找到了最好的解决方案。解决方案是在 property 的实现中使用该@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 回答