有人請解釋轉發和委派之間的區別嗎?他們看起來很相似,但我一直無法找到一個很好的轉發定義,所以我不確定我是否真的明白。在OOP中,什麼是轉發,與代表團有什麼不同?
回答
他們是類似的想法,一個對象依賴另一個幫助。考慮到我強烈的Objective-C偏差,以下是我對這兩種想法的看法:
代表團:需要做出決定,但我不想做出決定。我會讓我的委託處理。
例如,在Cocoa中,NSTableView使用委託來定製表的行爲。委託提供了一種通過讓另一個對象(代理)提供定製來定製一個對象的方法。繼續該示例,表視圖的委託實現了表用於與其委託進行交談的NSTableViewDelegate界面。
forwarding:有人給我發了一條我不明白的消息,但我知道另一個可能實現它的對象。我會將該消息的調用傳遞給該對象。
在Cocoa中,任何類都可以實現-forwardInvocation:方法。如果將消息發送給未實現該消息的對象,則會調用該對象的-forwardInvocation:方法,並且該對象可以決定將該調用傳遞給另一個對象。該對象可能是它的委託,或者它可能是一些系統範圍的錯誤處理程序,或其他。 NSProxy使用它來實現所有方法 - 它只是將調用傳遞給它的主對象。
請注意,轉發時,沒有定義的委託接口;該消息只是傳遞給另一個對象。另一個你看到我稱之爲轉發的地方是當一個對象包含另一個對象時,它用來實現一些接口。任何到那個接口的消息都只是被轉發到了包含的對象中,它完成了所有的工作。
轉發有點像「通過遏制繼承」或「實現繼承困難的方式」。
典型實現繼承:現在
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.
};
,您可以在轉發你不能(和你可能不希望,這就是爲什麼你會做)在運行時掉出委託的執行,而。
如果這回答了錯誤的問題,請在評論中告訴我,我將刪除答案。
我不認爲'unique_ptr'是可複製的。 –
那麼你是說轉發要求類將委託對象包含在類中,但委託可以選擇使用在類之外實例化的對象?兩者之間的區別還不完全清楚。 – vette982
@ vette982對不起,我在最後一個例子中忽略了一個重要的角色......馬上編輯。 –
讓我們先來定義兩個術語:
- 發件人:
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一個偉大的比喻:
代表團和轉發都非常相似。一個可能有助於區分它們的隱喻是想要收到一封電子郵件,要求你捐贈一些錢給一個有價值的慈善機構。
- 如果向前電子郵件給朋友,和朋友捐錢,朋友是捐出自己的錢和獲取自己的稅票。
- 如果您對代表回覆您的會計師,會計師將您的錢捐贈給慈善機構,並且您會收到稅收收據。
- 1. Erlang與OOP對象有什麼不同?
- 2. 與ramda.js代碼有什麼不同?
- 3. 與Angular代碼有什麼不同
- 4. 「((...))」與「(...)」有什麼不同?
- 5. 爲什麼要使用OOP概念? OOP的用法是什麼?
- 6. 網頁與aspnet表有什麼不同?
- 7. 機械化什麼是cookiejar,它與餅乾有什麼不同?
- 8. 什麼是Dockerfile.dev,它與Dockerfile有什麼不同
- 9. 谷歌的Dremel是什麼?它與Mapreduce有什麼不同?
- 10. 什麼是mdToken,它與MethodTable有什麼不同?
- 11. 什麼是CLI/C++?它與'普通'C++有什麼不同?
- 12. jQuery .focus(1)是做什麼的?與.focus()有什麼不同?
- 13. 什麼是renderAjax(),它與render()有什麼不同?
- 14. 張量:它是什麼,它與載體有什麼不同?
- 15. NaNi是什麼,它與NaN有什麼不同?
- 16. 什麼是具體調用,它與Reflection有什麼不同?
- 17. 什麼是動態方法,DynamicMethod與MethodBuilder有什麼不同?
- 18. 什麼是OOP工廠
- 19. 什麼是代表?
- 20. 什麼是代表?
- 21. 什麼是「| ... |」代表?
- 22. 什麼是代表?
- 23. 什麼是代表?
- 24. 什麼是parent.right(例如)恰好在QML中,它與parent.anchors.right有什麼不同?
- 25. 事件代表團,這是爲什麼不工作,通過ID
- 26. OOP不能做什麼?
- 27. 什麼是HMAC_CTX? CTX代表什麼?
- 28. SetFileValidData在做什麼?與SetEndOfFile有什麼不同?
- 29. 在這個Scala代碼中,compareTo與compareTo有什麼不同?
- 30. OOP PHP中的$ this->和parent ::有什麼不同?
不知道爲什麼這被拒絕...這似乎是一個有用的問題,雖然它可以使用更多的闡述。不幸的是,我們可能在這裏是一個Catch-22。我會盡力提供一個答案,如果我理解正確,提問者可以告訴我。 –