从另一个类更新类,封装问题

本文关键字:封装 问题 更新 另一个 | 更新日期: 2023-09-27 18:09:58

如何更新一个只能从另一个特定类更新的类?

在下面的示例中,封装被打破了,因为Sensor可以从任何其他类更新,而不仅仅是从Device更新。我说的对吗?

class Device
{
    public IEnumerable<Sensor> Sensors { get; private set; }
    void SomeInternalCall(int sensorId, int signal)
    {
        Sensors.First(s => s.Id == sensorId).Update(signal);
    }
}
class Sensor
{
    public int Id { get; private set; }
    public event Action<int> OnSignal;
    public void Update(int signal)
    {
        if (OnSignal != null) OnSignal(signal);
    }
}
class SensorUser
{
    public SensorUser(Sensor s)
    {
        s.OnSignal += SignalHandler;
    }
    void SignalHandler(int signal)
    {
        // ...
    }
}

从另一个类更新类,封装问题

您可以创建一个提供只读访问的接口并将其赋予SensorUser,而在Device中拥有Sensor实例的集合。

interface ISensor
{
    int Id { get;  }    
    event Action<int> OnSignal;
}
class Sensor : ISensor
{
    public int Id { get; private set; }    
    public event Action<int> OnSignal;
    public void Update(int signal)
    {
        if (OnSignal != null) OnSignal(signal);
    }
}
class SensorUser
{
    public SensorUser(ISensor s)
    {
        s.OnSignal += SignalHandler;
    }    
}