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]
,以避免重复代码。我已经更新了这个问题。