从另一个类更新类,封装问题 [英] Update class from another class, encapsulation issue

查看:220
本文介绍了从另一个类更新类,封装问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

$ p

在下面的例子中封装是坏的,因为传感器可以从任何其他类更新,不仅从设备。我是对的吗?

  class Device 
{
public IEnumerable< Sensor>传感器{get;私人集合

void SomeInternalCall(int sensorId,int signal)
{
Sensors.First(s => s.Id == sensorId).Update(signal);
}

}

class传感器
{
public int Id {get;私人集合}

public event Action< int> OnSignal;

public void Update(int signal)
{
if(OnSignal!= null)OnSignal(signal);
}
}

class SensorUser
{
public SensorUser(传感器)
{
s.OnSignal + = SignalHandler ;
}

void SignalHandler(int signal)
{
// ...
}
}


解决方案

您可以创建一个提供只读访问的接口,并将其提供给 SensorUser ,而设备中的传感器实例集合 p>

 接口ISensor 
{
int Id {get; }
事件Action< int> OnSignal;
}

class传感器:ISensor
{
public int Id {get;私人集合}
public event Action< int> OnSignal;

public void Update(int signal)
{
if(OnSignal!= null)OnSignal(signal);
}
}

class SensorUser
{
public SensorUser(ISensor s)
{
s.OnSignal + = SignalHandler ;
}
}


How must I update a class, which must be updated only from another specific class?

In the following example encapsulation is broken, because Sensor can be updated from any other class, not only from Device. Am I right?

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)
    {
        // ...
    }
}

解决方案

You can create an interface that provides read-only access and give it to SensorUser, while having a collection of Sensor instances in Device.

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;
    }    
}

这篇关于从另一个类更新类,封装问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆