更新类A中由类B创建的类X封装问题

时间:2013-04-19 16:31:35

标签: c# design-patterns encapsulation

上一个问题(更简单):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以返回结果。真实情况要复杂得多。

如何保持封装?

2 个答案:

答案 0 :(得分:2)

一种方法是分离请求和结果的概念。所以你有一个CommandRequest和一个CommandResult类。然后,Device类可以构造CommandResult类,并且不需要公共setter(不可变)。

答案 1 :(得分:0)

在程序集中定义命令和设备,在另一个程序集中定义用户。然后在结果内部设置setter。

public int Result { get; internal set; }