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
)(这是个坏消息)。这是一个设计问题,但不是委托模式