我是否破坏了封装?

本文关键字:封装 坏了 是否 | 更新日期: 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注册此事件,因此它完全没问题。