0

前の質問 (より簡単):別のクラスからのクラスの更新、カプセル化の問題

例:

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結果を返すようにメソッドを変更することは提案しないでください。実際の状況ははるかに複雑です。

カプセル化を維持するには?

4

2 に答える 2

2

1 つの方法は、要求と結果の概念を分離することです。したがって、CommandRequest クラスと CommandResult クラスがあります。その後、Device クラスは CommandResult クラスを構築でき、パブリック セッターは必要ありません (不変)。

于 2013-04-19T16:41:22.203 に答える
0

コマンドとデバイスをアセンブリで定義し、ユーザーを別のアセンブリで定義します。次に、結果のセッターを内部にします。

public int Result { get; internal set; }
于 2013-04-20T22:47:32.050 に答える