我是否破坏了封装?
本文关键字:封装 坏了 是否 | 更新日期: 2023-09-27 18:09:56
class Program
{
static void Main(string[] args)
{
B b = new B();
b.Run();
Console.Read();
}
}
class A
{
public event Action onChanged;
public void Raise()
{
if (onChanged != null)
onChanged();
}
}
class B
{
public void Run()
{
A a = new A();
a.onChanged += a_onChanged;
a.Raise();
}
private void a_onChanged()
{
Console.WriteLine("Wow! Invoked");
}
}
我无法找出有效的点,可以证明我打破了封装或可能是其他。根据我的理解,我破坏了封装,因为私有方法从另一个类调用,这足以证明我违反了面向对象的法则吗?需要为上面的代码收集更多的内部概念和描述
这实际上取决于为什么在a类中有Raise
方法。
如果它的存在仅仅是为了启用对私有成员的访问,那么答案将是:是的,您的封装已经被破坏了。onChanged
事件应该在某些东西发生变化时发生,而不是在某些外部类决定它应该发生时发生。
但是,如果这只是一个简单的快照,并且Raise
事件是触发事件的方法,作为所采取行动的副作用(例如在Textbox
中更改文本,然后触发onTextChanged
),那么您的封装仍然是有效的。
注意:
从维基百科:我正在打破封装作为一个私有方法被调用从另一个类
封装用于隐藏结构化数据的值或状态对象,防止未授权方直接访问给他们。可公开访问的方法通常在类(所谓的getter和setter)来访问值,以及其他客户端类调用这些方法来检索和修改值
私有方法可以从公共方法调用。不然怎么叫呢?这取决于你,程序员,让你的方法逻辑直接,并确保他们调用适当的方法。
您没有破坏类B的封装,因为B的实例只修改它们自己,但是,是的,您破坏了类a的封装。任何引用a的实例的东西都可以引发onChanged事件。
不,您没有破坏封装,私有方法从另一个类调用在这种情况下不是真的。类B
创建自己的A
,并调用Raise
方法,引发onChanged
事件。
您正在从 B
注册此事件,因此它完全没问题。