Можно ли создать интерфейс интерфейсов?

Можно ли создать интерфейс интерфейсов?
Можно ли создать интерфейс интерфейсов?

Вопрос в том, нужно ли создать новый интерфейс (назовем его 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, вам не нужно принуждать ее к этому.

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - Как делают хороший UI в играх (а как плохой) — дизайн интерфейса в RPG, MMO, экшнах и платформерах

Прикрепленное видео 2 - Процесс проектирования интерфейса в играх

Прикрепленное видео 3 - Java для начинающих. Урок 26: Интерфейсы


LetsCodeIt, 7 апреля 2023 г., 17:00