2011-12-13 84 views
2

我正在閱讀文檔,因爲我即將實現一個協議而不是類(我以前從未做過的事),而且我很好奇他們倆。類與協議之間有什麼區別

有人可以用簡單的話來舉個例子嗎?

感謝

+1

您是否熟悉其他面向對象的編程語言,比如Java,C++或C#?提供一種與另一種語言相似的比較容易,而不是從頭開始解釋。 – dasblinkenlight

回答

9

可用作根據該類的特定實現創建一個或多個對象的藍圖。 一個很好的比喻是切割黃油曲奇的一種形式。表單的屬性(形狀,大小,高度)定義了可以用它切出的cookie。你只有一個表單(類),但是你可以用它創建許多cookie(該類的實例,即對象)。所有的cookies都基於特定的形式。 類似地,作爲該類的實例的所有對象的屬性都是相同的。

類=數據方法(特殊功能),所有詭辯捆綁在一起。

類定義,有什麼自己的內心內容(數據)是+,他們可以做什麼樣的工作(方法)的。 內容基於變量,這些變量包含各種數字類型,字符串,常量以及其他更復雜的內容+方法,這些方法是(執行時)用各種數據執行一些計算操作的代碼塊。

在類中定義的所有方法有其 定義 - 定義方法的名稱+什麼(如果有的話)的數據的方法都在處理什麼(如果有的話)數據的方法吐出來了由別人處理。在類中定義的所有方法也有執行 - 提供處理的實際代碼 - 它是方法的內部工作..內部有處理數據的代碼,也可以請求其他方法處理數據。所以這個班是編程中非常高貴的一種。

如果你瞭解上述內容,你將會明白協議是什麼。

的協議是一組一個或多個方法聲明和該組都有一個名稱和表示協議。我說聲明,因爲一起由特定協議定義的方法,沒有定義任何實現代碼。。唯一存在的就是他們的名字。 請看上面 - 在課堂上,您不僅定義了課堂上有什麼方法,還定義瞭如何完成這些工作。但協議中的方法沒有任何實現。

讓我們再次有一個現實生活的比喻,它有幫助。如果你來我家住一週,你需要遵守我的TidyUp協議。 TidyUp協議定義了三種方法 - 每天清洗碗碟,清潔房間併爲新鮮空氣通風。這三種方法,我定義他們......你會做的。但我絕對不在乎,實現應該如何,我只是名義上定義方法。你會實現它們,即你定義了這些工作的細節(這些方法)是怎麼樣的。我只是說,堅持我的協議,並按照您認爲合適的方式實施。

壓軸 - 你可以聲明一些類。你也可以單獨聲明一個協議。然後你可以聲明,除了它自己的方法外,這個類將採用或遵守該協議,即。該類將實現協議的方法。

+0

協議是一組方法***聲明***,而不是像您所解釋的_definitions_。 –

0

協議定義了一類可以做,像Java中的接口或者C#

類是實際執行,沒有工作。

夠簡單嗎? :)

2

協議很像Java和其他語言中的接口。把它看作是描述其他類同意實現的接口的契約。它可以定義一個實現類將實現的必需和可選方法的列表。與類不同,它不提供這些方法的自己的實現。

1

與其他語言相比稍差。一個接口(相當於一個Java/C++類)定義了對象的數據佈局,並且可以定義它們方法的一些子集(當然包括定義整個集合的可能性)。協議只定義了一個方法子集,沒有數據定義。

重要的是一個接口只能從一個其他接口繼承(當然,它可以從繼承自繼承的接口繼承的接口繼承),但接口可以實現任意數量的協議。因此,沒有公共繼承的兩個不同的接口(NSObject除外)都可以實現相同的協議,從而「證明」它們提供相同的功能。 (儘管使用Objective-C,你可以用一些技巧調用一個接口的方法,這些方法在接口聲明或協議中都沒有外部聲明,因此協議在某種程度上只是「語法糖」或某種程度上的)。

2

The Objective-C Programming Language從所述的滑動詞語解釋簡單協議的目的:

協議聲明可以由任何類來實現的方法。 協議至少在三種情況下是有用的:

  • 要聲明的是,其它公司有望實現
  • 要將接口申報的對象,而隱藏其類
  • 爲了不在類中捕獲的相似方法分層相關

所以,聲明方法,但沒有提供實現協議。預計採用協議的類將實現協議的方法。

授權是協議有用的一個很好的例子。考慮一下,例如,UITableViewDataSource協議。任何類都可以採用該協議,並且任何類都可以用作表的數據源。表視圖不關心什麼樣的對象作爲其數據源;它只關心充當數據源的對象實現一組特定的方法。你可以爲此使用繼承,但是所有的數據源對象都必須從一個公共基類(比NSObject更具體)派生。相反,使用該協議,可以讓表格指望能夠調用諸如-tableView:willBeginEditingRowAtIndexPath:-tableView:heightForRowAtIndexPath:之類的方法,而無需知道關於數據源的其他任何信息。

相關問題