2011-10-19 63 views
15

有人請解釋轉發和委派之間的區別嗎?他們看起來很相似,但我一直無法找到一個很好的轉發定義,所以我不確定我是否真的明白。在OOP中,什麼是轉發,與代表團有什麼不同?

+0

不知道爲什麼這被拒絕...這似乎是一個有用的問題,雖然它可以使用更多的闡述。不幸的是,我們可能在這裏是一個Catch-22。我會盡力提供一個答案,如果我理解正確,提問者可以告訴我。 –

回答

2

他們是類似的想法,一個對象依賴另一個幫助。考慮到我強烈的Objective-C偏差,以下是我對這兩種想法的看法:

代表團:需要做出決定,但我不想做出決定。我會讓我的委託處理。

例如,在Cocoa中,NSTableView使用委託來定製表的行爲。委託提供了一種通過讓另一個對象(代理)提供定製來定製一個對象的方法。繼續該示例,表視圖的委託實現了表用於與其委託進行交談的NSTableViewDelegate界面。

forwarding:有人給我發了一條我不明白的消息,但我知道另一個可能實現它的對象。我會將該消息的調用傳遞給該對象。

在Cocoa中,任何類都可以實現-forwardInvocation:方法。如果將消息發送給未實現該消息的對象,則會調用該對象的-forwardInvocation:方法,並且該對象可以決定將該調用傳遞給另一個對象。該對象可能是它的委託,或者它可能是一些系統範圍的錯誤處理程序,或其他。 NSProxy使用它來實現所有方法 - 它只是將調用傳遞給它的主對象。

請注意,轉發時,沒有定義的委託接口;該消息只是傳遞給另一個對象。另一個你看到我稱之爲轉發的地方是當一個對象包含另一個對象時,它用來實現一些接口。任何到那個接口的消息都只是被轉發到了包含的對象中,它完成了所有的工作。

10

轉發有點像「通過遏制繼承」或「實現繼承困難的方式」。

典型實現繼承:現在

class Base 
{ 
public: 
    void baseFn() { } 
}; 

class Derived : public Base 
{ 
public: 
    void derivedFn() { } 
}; 

,導出的一個實例具有baseFn()方法。這是在不同類別之間共享實施的一種方式。

轉發如下:

class Contained 
{ 
public: 
    void containedFn() { } 
}; 

class Thing 
{ 
public: 
    void thingFn() { } 
    void containedFn() { mContained.containedFn(); } 
private: 
    Contained mContained; 
}; 

你可能還實施了與私有繼承。

授權是轉發的特例,其中「轉發事件」是接口本身。現在

class Delegate 
{ 
public: 
    virtual void doDelegateAction() = 0; 
}; 

class DelegateA : public Delegate 
{ 
    virtual void doDelegateAction() { } 
}; 

class DelegateB : public Delegate 
{ 
    virtual void doDelegateAction() { } 
}; 

class Thing 
{ 
public: 
    void Thing (Delegate * delegate) { mDelegate = delegate; } 
    void thingFn() { } 
    void containedFn() { if (mDelegate) mDelegate->doDelegateAction(); } 
private: 
    Delegate * mDelegate; // Note, we don't own this memory, buyer beware. 
}; 

,您可以在轉發你不能(和你可能不希望,這就是爲什麼你會做)在運行時掉出委託的執行,而。

如果這回答了錯誤的問題,請在評論中告訴我,我將刪除答案。

+0

我不認爲'unique_ptr'是可複製的。 –

+0

那麼你是說轉發要求類將委託對象包含在類中,但委託可以選擇使用在類之外實例化的對象?兩者之間的區別還不完全清楚。 – vette982

+0

@ vette982對不起,我在最後一個例子中忽略了一個重要的角色......馬上編輯。 –

7

讓我們先來定義兩個術語:

  • 發件人the object that sends a message/task to another object(the receiver)
  • 接收機the object that receives a message/task from the sender

轉發和代表團之間的差別是,在forwa rdingthe receiver acts in its own context代表團the receiver acts on the behalf of the sender

下面是這個blog post一個偉大的比喻:

代表團和轉發都非常相似。一個可能有助於區分它們的隱喻是想要收到一封電子郵件,要求你捐贈一些錢給一個有價值的慈善機構。

  • 如果向前電子郵件給朋友,和朋友捐錢,朋友是捐出自己的錢和獲取自己的稅票。
  • 如果您對代表回覆您的會計師,會計師將您的錢捐贈給慈善機構,並且您會收到稅收收據。
相關問題