Элегантный дизайн имитации объекта только для чтения - PullRequest
0 голосов
/ 12 ноября 2009

В настоящее время я разрабатываю GUI для встроенной системы. (я использую графический интерфейс для описания моего приложения, а не интерфейса, чтобы избежать путаницы с прогаматическим значением)

Контекст

Я создал класс, который имитирует встроенную систему. Все мои сообщения выполняются через разработанный мной класс Connection, который может взаимодействовать через TCP / Serial или виртуальное соединение между двумя Connection объектами.

Все это работает хорошо, и, как и ожидалось, мой моделируемый объект и GUI общаются через виртуальное соединение.

У меня есть пакет Diagnostic, который отправляется с device (реального или смоделированного) и читается GUI. Это хорошо вписывается в класс, который я назвал ControllerDiagnostic.

Вопрос

Мой вопрос относится к классу ControllerDiagnostic. Со стороны GUI все свойства должны быть доступны только для чтения (десериализация выполняется путем отражения непосредственно в приватных полях) . На стороне симуляции они явно должны быть изменяемыми. Так как мне справиться с этим элегантно? Я рассмотрел:

  • Создание совершенно нового класса, который имитирует ControllerDiagnostic, но предоставляет возможность установки полей.
  • Создание всех полей в ControllerDiagnostic защищенных, а затем наследование в закрытый вложенный класс, который предоставляет средства доступа к этим полям в классе моделирования.
  • Создание сборки только с двумя классами и с использованием установщика Internal.
  • Оставьте свойства для чтения / записи и документируйте, что GUI не должно их изменять.
  • Переписывает C #, чтобы я мог использовать friend так же, как и в C ++.

Ничто из этого не кажется мне идеальным.

Спасибо

1 Ответ

0 голосов
/ 14 ноября 2009

Вы можете написать интерфейс, который предоставляет все свойства вашего класса с помощью методов получения и установки, а второй интерфейс, который предоставляет только методы получения для всех ваших свойств. Затем пусть один класс реализует оба интерфейса и использует интерфейс только для получения в графическом интерфейсе.

В коде это может выглядеть примерно так:

public interface IReadWrite
{
    string SomeString { get; set; }
}

public interface IReadOnly
{
    string SomeString { get; }
}

public class TestClass : IReadWrite, IReadOnly
{
    public string SomeString { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...