Дополнительный интерфейс в библиотеках классов - PullRequest
1 голос
/ 17 сентября 2010

У меня есть интерфейс под названием IProjectUser, который определяет функцию чтения и функцию записи для чтения и записи в файлы проекта. У меня также есть класс Project, который содержит общий список объектов IProjectUser для управления файлами проекта. Оба они находятся в библиотеке классов Project.dll.

У меня также есть библиотека классов с именем A.dll, которая содержит класс с именем Foo, который реализует IProjectUser. Возможность чтения / записи файлов проекта является вторичной по отношению к этому классу. Он держит и манипулирует некоторыми данными. A.dll ссылается на Project.dll.

Приложение также содержит некоторые формы и другие классы, которые реализуют IProjectUser.

Я могу представить себе ситуацию в будущем, когда я захочу использовать A.dll в другом проекте, который не использует файлы проекта. Однако я буду вынужден включить Project.dll только потому, что это требуется A.dll. Даже если функциональность не является обязательной.

Существует ли другой шаблон проектирования, который позволил бы мне сделать интерфейс необязательным?

Надеюсь, я объяснил это достаточно ясно.

Обновление

А как насчет приведения объектов к интерфейсам? Это открыло бы возможность того, что интерфейс не реализован правильно. Это хороший или плохой подход к дизайну для такого рода проблем?

if (Foo is IProjectUser) {
  ProjectUsers.Add(Foo as IProjectUser);
  // etc
}

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

Использовать унаследованные или несколько интерфейсов. Вы не можете сделать метод интерфейса необязательным.

1 голос
/ 17 сентября 2010

Преобразование вашего объекта в интерфейс, который он не реализует, не будет работать - в результате вы получите нулевое значение в вашей переменной.Что не так с использованием правильного дизайна и добавлением B.dll, как предложено ниже?A.dll становится полностью пригодным для повторного использования, и вы по-прежнему получаете версию Foo, которая реализует IProjectUser.

  1. Удалите ссылку на Project.dll из A.dll.
  2. Удалите IProjectUserfrom Foo.
  3. Создайте B.dll, который ссылается на Project.dll и A.dll.
  4. Создайте FooProjectUser в B.dll, который наследует от Foo и реализует IProjectUser.
  5. Moveспецифическая для проекта логика из Foo в FooProjectUser.
  6. Используйте FooProjectUser в тех местах, где вы в данный момент используете Foo, освобождая A.dll от любых ссылок на Project.dll.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...