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");
}
}
我无法找出可以证明我破坏封装的有效点,或者可能不是。根据我的理解,我正在打破封装,因为私有方法正在从另一个类调用,这是否足以证明我违反了OOP法则。需要为上面的代码收集更多的内部概念和描述。
答案 0 :(得分:2)
这实际上取决于为什么在A类中有Raise
方法。
如果只是为了允许访问私人会员,那么答案就是:是的,您的封装已被泄露。
onChanged
事件应该在某些内容发生变化时发生,而不是在某些外部类决定它应该发生时。
但是,如果这只是一个简单的快照来制作一个点,那么Raise
事件就是一个触发事件的方法,作为对所采取行动的副作用(比如改变{{{ 1}}然后触发Textbox
),而你的封装仍然是机智的。
注意:
我打破了封装,因为调用了私有方法 来自另一个班级
来自Wikipedia:
封装用于隐藏结构化数据的值或状态 一个班级内的对象,防止未经授权的聚会'直接访问 给他们。通常提供公众可访问的方法 class(所谓的getter和setter)来访问值,以及其他 客户端类调用这些方法来检索和修改值 在对象内。
从公共方法调用私有方法是可以的。它怎么会被称为?程序员可以直接得到你的方法逻辑并确保他们调用适当的方法。
答案 1 :(得分:1)
你没有打破B类的封装,因为B的实例只会修改它们自己,但是,你打破了A类的封装。任何引用A实例的东西都可以引发onChanged事件。 / p>
答案 2 :(得分:0)
不,你没有打破封装,并且从另一个类调用私有方法在这种情况下是不正确的。类B
会创建自己的A
并调用它Raise
方法,该方法会引发onChanged
事件。
您正在注册此事件来自 B
,因此它完全没问题。