Разделение интерфейса между двумя классами - PullRequest
1 голос
/ 29 марта 2012

Мне хочется, чтобы интерфейс мог состоять из методов, которые выполняются в нескольких классах.Если бы я мог это сделать, я мог бы создать интерфейс для роли, в которой есть одна функция из этого класса и одна функция из этого класса.

Поддерживает ли это какой-либо язык?Возможно ли это в типичном OO в стиле Java / C # / VB.NET?

Например: у меня есть функция, которая принимает объект значения и сохраняет все части в правильные таблицы.Я только что создал интерфейс под названием StatsPersistence, который я вставляю в функцию, чтобы я мог тестировать ее поведение, но в ней отсутствует метод.Я хочу иметь возможность добавить к этому метод, но этот метод находится в классе, отличном от первых двух, так что это, очевидно, невозможно.Итак, у меня есть 2 метода в одном классе и 1 в другом, но оба они необходимы для «роли» «StatsPersistence».Кроме того, все эти методы необходимы и для других ролей, не только для этой.

Что у меня есть:

interface StatsPersistence
    public saveSession(session)  // fulfilled in much larger StatsActiveRecord
    public saveAppUse(appUse)    // fulfilled in much larger StatsActiveRecord

Что я хочу:

interface StatsPersistence
    public saveSession(session)  // fulfilled in much larger StatsActiveRecord
    public saveAppUse(appUse)    // fulfilled in much larger StatsActiveRecord
    public updateUnit(name)      // fulfilled in much larger UnitActiveRecord

Я мог бы просто создать новый класс, который обернул бы все три метода, и сделать так, чтобы этот класс просто делал вызовы двум реализаторам, но это похоже на множество OOverkill.наклоняясь к:

  • Моя роль интерфейса слишком широка
  • Создайте класс, который объединяет эти три, и заставьте его реализовать желаемый интерфейс

1 Ответ

2 голосов
/ 29 марта 2012

Предположим, у вас есть переменная типа StatsPersistence.Контракт интерфейса заставляет любой экземпляр StatsPersistence иметь три метода.Следовательно, StatsActiveRecord не может быть сохранен как StatsPersistence, так и для UnitActiveRecord.Это означает, что ни один объект не может быть экземпляром StatsPersistence, поскольку ни один объект не выполняет контракт интерфейса.Таким образом, невозможно разделить реализацию интерфейса между классами.

Есть несколько альтернатив.

Как вы упомянули, у вас может быть мастер-класс, который реализует интерфейс и вызывает два отдельныхклассы.Это может быть сложно, так как мастер связывает два «подкласса».

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

Лучшее решение (в общем случае) - объединить классы.Если два класса должны работать вместе, чтобы решить, кто делает определенные вещи, они также могут быть одним классом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...