vet*_*982 20 c++ oop forwarding class delegation
有人请解释转发和委托之间的区别吗?它们看起来很相似,但我还没有找到一个好的转发定义,所以我不确定我是否真的理解.
Ant*_*nyS 15
我们先来定义两个术语:
the object that sends a message/task to another object(the receiver)the object that receives a message/task from the sender之间的区别转发和代表团的是,在转发 the receiver acts in its own context,而在代表团 the receiver acts on the behalf of the sender.
这篇博文中有一个很好的比喻:
委派和转发都非常相似.可能有助于区分它们的一个比喻是考虑收到一封电子邮件,要求您向有价值的慈善机构捐赠一些钱.
Mic*_*ice 10
转发有点像"通过遏制继承",或"艰难实施继承".
典型的实现继承:
class Base
{
public:
void baseFn() { }
};
class Derived : public Base
{
public:
void derivedFn() { }
};
Run Code Online (Sandbox Code Playgroud)
现在,Derived的一个实例有一个baseFn()方法.这是一种在不同类之间共享实现的方法.
转发看起来像这样:
class Contained
{
public:
void containedFn() { }
};
class Thing
{
public:
void thingFn() { }
void containedFn() { mContained.containedFn(); }
private:
Contained mContained;
};
Run Code Online (Sandbox Code Playgroud)
您也可以使用私有继承实现它.
委托是转发的一个特例,其中"转发的东西"是一个接口本身.
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.
};
Run Code Online (Sandbox Code Playgroud)
现在,你可以在运行时交换委托的实现,而在转发中你不能(你可能不想这样做,这就是为什么你会这样做).
如果这回答了错误的问题,请在评论中告诉我,我将删除答案.
它们的想法相似,一个对象依赖另一个对象来寻求帮助。鉴于我强烈的 Objective-C 偏见,我对这两个想法的看法如下:
代表团:需要做出决定,但我不想做。我会让我的代表来处理这件事。
例如,在 Cocoa 中,NSTableView使用委托来自定义表的行为。委托提供了一种通过让另一个对象(委托)提供定制来定制一个对象的方法。继续这个示例,表视图的委托实现了一个NSTableViewDelegate接口,表使用该接口与其委托进行通信。
转发:有人刚刚给我发了一条我不明白的消息,但我知道另一个对象可能会实现它。我将该消息的调用传递给该对象。
同样,在 Cocoa 中,任何类都可以实现 -forwardInitation :方法。如果将消息发送到未实现该消息的对象,则调用该对象的 -forwardInitation: 方法,并且该对象可以决定将调用传递给另一个对象。该对象可以是它的委托,也可以是某个系统范围的错误处理程序,或者其他什么。NSProxy使用它来实现所有方法——它只是将调用传递给它的主对象。
请注意,对于转发,没有定义的委托接口;消息只是传递给另一个对象。您会看到我所说的转发的另一个地方是当一个对象包含它用来实现某个接口的另一个对象时。发送到该接口的任何消息都只会转发到包含的对象,该对象完成所有工作。
| 归档时间: |
|
| 查看次数: |
8200 次 |
| 最近记录: |