Oop 委托模式是否破坏了封装?

Oop 委托模式是否破坏了封装?,oop,delegates,encapsulation,composition,information-hiding,Oop,Delegates,Encapsulation,Composition,Information Hiding,假设我有一个接受委托的类: public class DelegateContainer { private IDelegate delegate; public DelegateContainer(IDelegate delegate) { this.delegate = delegate; } public void doSomething() { delegate.doSomethingOnlyForThi

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

public class DelegateContainer
{
    private IDelegate delegate;

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

    public void doSomething()
    {
        delegate.doSomethingOnlyForThisPurpose();
    }
{
如您所见,委托的doSomethingOnlyForThisPurpose()方法只存在于委托类调用的情况下。但是,要求该方法是公共的,并且可以由任何对象执行。如果它绝对不应该由它所附加的委托类以外的任何对象执行(特别是如果委托类在依赖项中传递的话),那么这不会破坏封装吗?我认为解决这个问题的唯一方法是设计一个对象,该对象只能由委托类(内部类)实例化,该类被传递给每个调用的方法。然而,这是非常复杂的,无论如何也不是无懈可击的。有没有办法解决这个问题,或者说是病理性的


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

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

您的
IDelegate.doSomething实现的目的应该是实现它所做的事情,而不管它是否被
DelegateContainer调用。我的意思是,如果这个方法被“坏人”调用是危险的,那么它将与
DelegateContainer
紧密耦合。在这种情况下,破坏封装的不是委托模式

只需简单说明一下:

我不知道你在用什么语言。在
C#
中,您可以实现
IDelegate.dosomethingonly用于此目的
明确供对此接口特别感兴趣的人使用:

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.
    }
}
结论:如果“onlyforstipurpose”表示随时调用该方法是不安全的(您已经知道这一点),那么您不应该有一个名为
dosomethingly的非私有方法用于此目的
,如果您“害羞”发布该方法,您不应该希望该方法在类之外被调用(通过
DelegateContainer
)(这是个坏消息)。这是一个设计问题,但不是委托模式