2012-04-05 95 views
0

我有一個基類MyDevice。另外我有一個基類MyDeviceControllerObjective-C屬性/繼承/設計建議

@interface MyDeviceController : NSObject { 
    MyDevice* device; 
} 

@property (retain) MyDevice* device; 

@end 

MyDeviceController在設備的二傳手一些共同的邏輯,我想繼續在子類中。

我有2子mydevice在的:的MyDeviceController

@interface MyAudioDevice : MyDevice 

- (void)audioMethod; 

@end 

@interface MyVideoDevice : MyDevice 

- (void)videoMethod; 

@end 

和兩個子類:MyVideoDeviceControllerMyAudioDeviceController其中必須有一個MyVideoDeviceMyAudioDevicedevice財產。

什麼是實現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方法。

可能還有另一種解決方案嗎?

+0

使用的接口(我忘了還有在Objective-C調用)的mydevice在(一個或多個),然後程序,如此控制器可以接受任何類型的設備。 – 2012-04-05 13:08:04

+0

@TomIngram:協議是你所追求的 – dreamlax 2012-04-06 07:41:47

回答

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 
0

在您的控制器中重寫-(void)setDevice:(Device *)device以確保它只接受MyVideoDeviceMyAudioDevice。如果您需要通用控制器的邏輯,只需複製它。

+0

是的,但我也需要'device'方法來返回MyAudioDevice。我也打電話給我的'[super setDevice:device]'以避免重複的代碼。 我已經更新了這個問題。 – Dmitry 2012-04-06 07:14:40

0

我的目標-c有點小,但希望這可以讓你瞭解我在評論中的含義。

「使用一個接口(我忘了那裏有什麼叫做objective-c)mydevice(s),然後編程,以便控制器可以接受任何類型的設備。」

從理論上講,設備的所有東西都應該是私有的,而且你使用的是一個通用接口,所以你可以有許多不同的具體設備,而不用擔心它。

的接口如

@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 
+0

但是我對不同的設備有不同的方法:'MyVideoDevice'的'videoMethod'和'MyAudioDevice'的'audioMethod',這就是爲什麼我必須在'MyAudioDeviceController'中使用'device'作爲'MyAudioDevice',而不是'MyDevice'。 – Dmitry 2012-04-06 06:36:27