我打破了封装吗?

时间:2014-06-23 05:40:28

标签: c# oop events delegates

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法则。需要为上面的代码收集更多的内部概念和描述。

3 个答案:

答案 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,因此它完全没问题。