2012-10-02 50 views
0

我在@protocol中使用了一個Object方法,但協議只支持方法聲明,有人可以幫我解釋如何將它與同一方法的方法定義連接起來(在哪裏編寫方法定義)。協議中的方法定義

+0

我認爲你在這裏混淆了一些東西。你的意思是把方法*實現*放在哪裏? – DrummerB

+2

您可能需要閱讀['protocol protocol'](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectivec/chapters/ocProtocols.html)以瞭解協議的使用方式。 – Joe

+0

將'@class對象;'放在'@ protocol'聲明之上。 – basvk

回答

1

協議只是方法聲明的列表,沒有任何實現。它們可以用來將一組可能的(類)限制爲那些實現某個協議的類。

例如,如果您有GasStation類,則可能需要限制可在該站加油的對象的類型(類)。當然,你可以簡單地要求對象是類Vehicle的後代,就像這樣:

@interface GasStation : NSObject 
- (void)refuel:(Vehicle *)vehicle; 
@end 

@implementation GasStation 
- (void)refuel:(Vehicle *)vehicle { 
    [vehicle addFuel:100]; 
} 
@end 

,但這不會允許儲罐被填滿的實例。但是,允許傳遞任何類型的對象也是一個壞主意,因爲如果您通過Cat的實例,則在嘗試向其發送addFuel:消息時肯定會發生錯誤。

因此,你定義一個協議,該協議可充燃料類必須實現:

@protocol RefuelableThing 
@required 
- (void)addFuel:(float)fuel; 
@end 

現在你可以使用該協議來限制可以加油的對象類型:

@interface GasStation : NSObject 
- (void)refuel:(NSObject<RefuelableThing> *)thing; 
@end 

一個Vehicle會當然有一個方法addFuel:,所以JerryCan可以實現它自己的獨立版本,即使它不是Vehicle

0

一旦聲明協議,任何符合它的類都可以實現該協議中的方法。只需導入聲明協議的頭文件,將協議添加到該類的接口並在.m中實現讀取該主題的方法是一個很好的建議,btw