2012-04-05 5 views
0

나는 기본 클래스 MyDevice을가집니다. 또한 나는 기본 클래스 MyDeviceController 있습니다Objective-C 속성/상속/디자인 조언

@interface MyDeviceController : NSObject { 
    MyDevice* device; 
} 

@property (retain) MyDevice* device; 

@end 

MyDeviceController 내가 서브 클래스에서 유지하려는 장치의 세터의 몇 가지 일반적인 논리를 가지고 있습니다. MyDeviceController

@interface MyAudioDevice : MyDevice 

- (void)audioMethod; 

@end 

@interface MyVideoDevice : MyDevice 

- (void)videoMethod; 

@end 

그리고 두 개의 서브 클래스 : MyVideoDeviceControllerMyAudioDeviceController device 특성으로 MyVideoDeviceMyAudioDevice이 있어야

나는 MyDevice 2 개 서브 클래스가 있습니다.

MyDeviceController의이 두 하위 클래스를 구현하는 가장 좋은 방법은 무엇입니까? 또는 그런 경우에 대한 약간의 후퇴가있을 수 있습니까?

@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 

나는이 솔루션에 좋아하지 않는 유일한 것은의를 :

은 내가 찾은 첫 번째 솔루션은 My[Audio|Video]DeviceController에 속성을 재 선언 할

입니다 업데이트 device 메서드의 재정의입니다.

다른 해결책이있을 수 있습니까?

+0

사용하는 인터페이스 때문에 컨트롤러가 장치의 모든 유형을 받아 들일 수에 다음 mydevice (들) 및 프로그램 (내가 목표 - C에있다라는 것을 잊지). –

+0

@TomIngram : Protocols은 – dreamlax

답변

0

컨트롤러

@interface AudioDevice : NSObject <MediaDevice> 
@end 

@implementation AudioDevice 
- void play 
{ 
    [super play] 
} 
// ... 
@end 

@protocol MediaDevice 
- void play 
- void stop 
- void pause 
@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 
0

컨트롤러에 -(void)setDevice:(Device *)device을 다시 작성하여 MyVideoDevice 또는 MyAudioDevice 만 받아 들여야합니다. 일반 컨트롤러에서 로직이 필요한 경우이를 복사하십시오.

+0

뒤에 있습니다. 그렇지만'MyAudioDevice'를 반환하려면'device' 메소드가 필요합니다. 중복 된 코드를 피하기 위해'[super setDevice : device]'라고 부릅니다. 질문을 업데이트했습니다. – Dmitry

0

내 목표 - C는 조금 벗어 났지만 잘하면 내 의견에 무슨 뜻인지 알 수 있습니다.

"mydevice (s)에서 인터페이스를 사용하고 (objective-c에서 호출 한 것을 잊어 버렸습니다.) 컨트롤러가 모든 유형의 장치를 허용 할 수 있도록 프로그래밍하십시오."

이론적으로는 장치에 중요한 모든 것이 비공개이어야하며 공용 인터페이스를 사용하면 여러 가지 구체적인 장치를 가질 수 있으므로 걱정할 필요가 없습니다.

인터페이스 등

@interface DeviceController : NSObject 
@property (readwrite, assign) MediaDevice device 
@end 
+0

하지만 장치마다 다른 메소드가 있습니다 :'MyVideoDevice'의'videoMethod'와'MyAudioDevice'의'audioMethod'는'MyDevice'가 아닌'MyAudioDeviceController'에서'device'를'MyAudioDevice'로 사용해야하는 이유입니다. – Dmitry

관련 문제