2011-11-03 21 views
6

Tôi có hai giao thứcLàm thế nào tôi có thể phân biệt cùng một tên phương thức của hai giao thức trong một lớp thực hiện?

@protocol P1 

-(void) printP1; 

-(void) printCommon; 

@end 


@protocol P2 

-(void) printP2; 

-(void) printCommon; 
@end 

Bây giờ, tôi đang thực hiện hai giao thức này trong một lớp

@interface TestProtocolImplementation : NSObject <P1,P2> 
{ 

} 

@end 

Làm thế nào tôi có thể viết thực hiện phương pháp "printCommon". Khi tôi cố gắng thực hiện tôi có lỗi thời gian biên dịch.

Có khả năng viết phương pháp triển khai phương thức nào cho "printCommon" hay không.

+0

Bạn có thể đăng lỗi và triển khai của mình không? – jbat100

+0

#pragma mark - #pragma đánh dấu các phương thức giao thức P1 - (void) printP1 { \t NSLog (@ "print p1"); } - (void) printCommon { \t NSLog (@ "In P1"); } #pragma mark - #pragma đánh dấu các phương thức giao thức P2 - (void) printP2 { \t NSLog (@ "print p2"); } - (void) printCommon { \t NSLog (@ "In P2"); \t } Lỗi: định nghĩa lại '- [TestObjectLifeCycle printCommon]' Nó hoạt động tốt khi tôi xóa bất kỳ phương pháp triển khai phương thức "printCommon" nào. – selva

Trả lời

14

Giải pháp thông thường là để tách các giao thức phổ biến và thực hiện các giao thức có nguồn gốc thực hiện các giao thức phổ biến, như vậy:

@protocol PrintCommon 

-(void) printCommon; 

@end 

@protocol P1 <PrintCommon> // << a protocol which declares adoption to a protocol 

-(void) printP1; 

// -(void) printCommon; << available via PrintCommon 

@end 


@protocol P2 <PrintCommon> 

-(void) printP2; 

@end 

Bây giờ loại trong nước áp dụng P1P2 cũng phải chấp nhận PrintCommon phương pháp 's để hoàn thành việc chấp nhận và bạn có thể chuyển an toàn thông số NSObject<P1>* đến thông số NSObject<PrintCommon>*.

2

cho tôi đoạn mã sau đã làm việc:

@protocol P1  

- (void) method1; 

@end 

@protocol P2 

- (void) method1; 
- (void) method2; 

@end 

@interface C1 : NSObject<P1, P2> 

@end 

@implementation C1 

- (void) method1 
{ 
    NSLog(@"method1"); 
} 

- (void) method2 
{ 
    NSLog(@"method2"); 
} 

@end 

trình biên dịch sử dụng: Apple LLVM 3,0 Nhưng nếu bạn đang thiết kế một giải pháp như thế này, cố gắng tránh những tình huống như vậy.

Các vấn đề liên quan