Вопрос в том, нужно ли создать новый интерфейс (назовем его
Interface4
), который реализуетInterface1
иInterface2
, чтобы я мог запросить его следующим образом?
Если вы хотите получить один объект, реализующий оба интерфейса, вы, вероятно, также хотите хранить одну ссылку на этот объект. Если вы объявите свою ссылку как Interface1 iA
, то вы не сможете получить доступ к методам Interface2
без уродливых трюков типизации, и наоборот, если вы объявите ее как Interface2 iA
.
Единственный способ объявить ссылку типа, который может получить доступ к методам Interface1
и Interface2
, - это создать Interface4
, который объединяет эти два интерфейса. И ваши классы реализации также должны будут объявить, что они реализуют Interface4
.
И затем, если позже компоненту понадобится реализация
Interface2
иInterface3
, тогда нужно будет создатьInterface5
? Каков наилучший подход к работе с этими интерфейсами?
Если вы регулярно сталкиваетесь с этой проблемой, вам нужно критически пересмотреть то, как вы определяете, какие интерфейсы вам нужны. Возможно, вам вообще не следовало создавать Interface1
, Interface2
и Interface3
, а только Interface4
и Interface5
.
Interface1 i0 = new Implementation1();
Просто сделайте это высоко в стеке вызовов (скажем, в main) и передайте это в то, что нуждается в этом. Это нечто может использовать его как объект, реализующий Interface1
, не зная и не заботясь о том, что он оказывается Implementation1
.
Создание Inferface4
действительно оправдано только в том случае, если объект используется каким-то образом. В лучшем случае, создание интерфейсов только для того, чтобы порадовать сервисный локатор - это халтура. Интерфейсы и объекты (даже синглтонные объекты) никогда не должны были иметь исключительно отношения 1 к 1. Интерфейсы предназначены для выражения того, что нужно клиентскому (использующему) коду.
Также стоит отметить, что интерфейсы - это не единственный вид ключа, который может использовать ваш сервис-локатор/контейнер/карта. Так что если ваша кодовая база не имеет естественных отношений 1 к 1, вам не нужно принуждать ее к этому.
Прикрепляю к посту несколько видео по теме: