0

假设我有一个接受委托的类:

public class DelegateContainer
{
    private IDelegate delegate;

    public DelegateContainer(IDelegate delegate)
    {
        this.delegate = delegate;
    }

    public void doSomething()
    {
        delegate.doSomethingOnlyForThisPurpose();
    }
{

如您所见,委托的 doSomethingOnlyForThisPurpose() 方法仅存在以由委托类调用。但是,要求此方法是公共的,并且可以由任何东西执行。如果它绝对不应该由它所附加的委托类以外的任何东西执行(特别是如果委托类传递了依赖项),那么这不会破坏封装吗?我想解决这个问题的唯一方法是设计一个只能由传递给每个调用方法的委托类(内部类)实例化的对象。但是,这非常复杂,而且无论如何都不是水密的。有什么办法可以解决这个问题还是病态?

注意:我想坚持这种组合方法,所以我宁愿不求助于继承。

4

1 回答 1

0

它不应该破坏封装。您对 IDelegate 的实现发布了一些行为,任何人都可以调用这些行为,这些行为可以被引用 this 实例的任何人调用,因此它应该像任何其他公共行为一样使用所需的抽象来实现。如果您希望任何人拥有实例,请公开您的构造函数。如果你不这样做,那么你就像你所做的那样(使用私有或受保护的构造函数)。

您的实现的目的IDelegate.doSomethingOnlyForThisPurpose应该是做它所做的事情,无论是否被DelegateContainer. 我的意思是,如果这种方法被“错误的人”调用是危险的,那么它与DelegateContainer. 在这种情况下,破坏封装的不是委托模式。

只是一个简短的说明:

不知道你用的是什么语言。C#您可以明确地实现以IDelegate.doSomethingOnlyForThisPurpose供对此接口特别感兴趣的人使用:

class MyClass: IDelegate
{

    void IDelegate.doSomethingOnlyForThisPurpose() {

        // This method is only visible by 
        // who is representing your object as IDelegate.
        // It's not visible by who is representing it as MyClass.
    }
}

结论:doSomethingOnlyForThisPurpose如果“OnlyForThisPurpose”意味着随时调用它是不安全的(您已经知道这一点),您不应该调用非私有方法,并且您不应该希望在您的类之外调用您的方法(通过DelegateContainer)如果您是“害羞”发布它(这是个坏消息)。这是一个设计问题,但不是委托模式的问题。

于 2014-10-10T12:30:02.270 回答