Objective-C属性/继承/设计建议

Objective-C属性/继承/设计建议,objective-c,oop,design-patterns,inheritance,properties,Objective C,Oop,Design Patterns,Inheritance,Properties,我有一个基类MyDevice。我还有一个基类MyDeviceController: @interface MyDeviceController : NSObject { MyDevice* device; } @property (retain) MyDevice* device; @end @interface MyAudioDeviceController : MyDeviceController @property (retain) MyAudioDevice* devic

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

@interface MyDeviceController : NSObject {
    MyDevice* device;
}

@property (retain) MyDevice* device;

@end
@interface MyAudioDeviceController : MyDeviceController

@property (retain) MyAudioDevice* device;

@end
MyDeviceController在设备的setter中有一些常见的逻辑,我想将其保存在子类中

我有两个子类MyDevice:

@interface MyAudioDevice : MyDevice

- (void)audioMethod;

@end

以及
MyDeviceController
的两个子类:
MyVideoDeviceController
MyAudioDeviceController
,它们必须具有
MyVideoDevice
MyAudioDevice
属性

实现MyDeviceController这两个子类的最佳方法是什么?或者这种情况是否有规律可循

更新

我找到的第一个解决方案是在
My[Audio | Video]DeviceController
中重新声明属性:

@interface MyDeviceController : NSObject {
    MyDevice* device;
}

@property (retain) MyDevice* device;

@end
@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
在这个解决方案中,我唯一不喜欢的是重新定义
设备
方法


可能还有其他解决方案吗?

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

我的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

我想我找到了最好的解决办法。解决方案是在属性
设备
的实现中使用
@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

为我的设备使用一个接口(我忘记了objective-c中的调用)然后对其进行编程,以便控制器可以接受任何类型的设备。@TomIngram:协议是您所追求的,但我对不同的设备有不同的方法:
videoMethod
用于
MyVideoDevice
audioMethod
用于
MyAudioDevice
,这就是为什么我必须在
MyAudioDeviceController
中使用
device
作为
MyAudioDevice
,而不是
MyDevice
。是的,但我还需要
device
方法返回
MyAudioDevice
。我还调用了我的
[super-setDevice:device]
,以避免重复代码。我已经更新了这个问题。