簡體   English   中英

Objective-C 財產/繼承/設計咨詢

[英]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的兩個子類: MyVideoDeviceControllerMyAudioDeviceController ,它們必須將MyVideoDeviceMyAudioDevice作為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以確保它只接受MyVideoDeviceMyAudioDevice 如果需要通用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM