Элегантный дизайн имитации объекта только для чтения

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

Контекст

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

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

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

Вопрос

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

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

Мне все это не кажется идеальным.

Спасибо


person Community    schedule 12.11.2009    source источник


Ответы (1)


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

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

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

public interface IReadOnly
{
    string SomeString { get; }
}

public class TestClass : IReadWrite, IReadOnly
{
    public string SomeString { get; set; }
}
person andyp    schedule 14.11.2009