[英]Objective-C property/inheritance/design advice
我有一個基本的 class MyDevice
。 我還有一個基礎 class 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
,它們必須將MyVideoDevice
和MyAudioDevice
作為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
方法的重新定義。
可能有另一種解決方案嗎?
在控制器中重寫-(void)setDevice:(Device *)device
以確保它只接受MyVideoDevice
或MyAudioDevice
。 如果需要通用controller的邏輯,復制過來即可。
我的 objective-c 有點不對勁,但希望這能讓您了解我在評論中的意思。
“為我的設備使用一個接口(我忘記了在 objective-c 中調用的是什么),然后對其進行編程,這樣 controller 就可以接受任何類型的設備。”
從理論上講,設備的所有特定內容都應該是私有的,並且您可以使用通用接口,這樣您就可以擁有許多不同的具體設備而不必擔心。
一個接口,例如
@protocol MediaDevice
- void play
- void stop
- void pause
@end
實施
@interface AudioDevice : NSObject <MediaDevice>
@end
@implementation AudioDevice
- void play
{
[super play]
}
// ...
@end
controller
@interface DeviceController : NSObject
@property (readwrite, assign) MediaDevice device
@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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.