从另一个类更新类,封装问题 [英] Update class from another class, encapsulation issue
本文介绍了从另一个类更新类,封装问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
$ 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屋!
查看全文