上一个问题(更简单):Update class from another class, encapsulation issue
示例:
class User
{
public void BeginWork(Device device)
{
Command command = new Command(1);
device.ExecuteCommand(command);
Console.WriteLine("Result={0}", command.Result);
}
}
class Command
{
public int Code {get; private set;}
public Command(int code) { Code = code; }
public int Result { get; set; }
}
class Device
{
public void ExecuteCommand(Command command)
{
/* ... */
// Analyzing and execution of command leads to a result
if(command.Code == 1) command.Result = 5;
else if(command.Code == 2) command.Result = 36;
/* ... */
}
}
用法:
User u = new User();
Device d = new Device();
u.BeginWork(d);
如您所见,封装被类Result
的属性Command
的公共集访问器破坏
不建议更改方法ExecuteCommand
以返回结果。真实情况要复杂得多。
如何保持封装?
答案 0 :(得分:2)
一种方法是分离请求和结果的概念。所以你有一个CommandRequest和一个CommandResult类。然后,Device类可以构造CommandResult类,并且不需要公共setter(不可变)。
答案 1 :(得分:0)
在程序集中定义命令和设备,在另一个程序集中定义用户。然后在结果内部设置setter。
public int Result { get; internal set; }