Избегайте приведения с общим интерфейсом с дополнительными методами - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть 2 класса, оба имеют общий базовый класс. Но сверху у них есть дополнительные методы, уникальные для каждого класса. Они управляются в коллекции объектов базового типа.

Теперь, когда я хочу использовать дополнительные методы, я должен проверять тип и приведение.

Как мне этого избежать? До сих пор я придумал

  • реализация фиктивных методов (и их игнорирование)
  • кастинг (я считаю, что это не очень элегантно)
  • шаблон посетителя (но есть функциональность в посетителе)

Я хочу выяснить, есть ли у кого-нибудь другие идеи. (Псевдокод)

Interface CommonBase
{
    void Common method()
}

class SubClassA : CommonBase
{
    void Extra MethodA()
}

class SubClassB : CommonBase
{
    void Extra MethodB()
}

У меня есть список List<CommonBase>. Как избежать кастования перед вызовом метода A / B? Или как-то выполнить функциональность метода A / B?

1 Ответ

1 голос
/ 17 апреля 2019

Поведение, которое вы пытаетесь выполнить, заключается в том, что вы хотите ссылаться на экземпляры подкласса с базовым классом / типом интерфейса, но вы хотите вызывать методы, специфичные для подклассов. Это противоречиво, потому что при обработке объектов, которые имеют разные типы, но имеют общую базу, предполагается, что процессор не заботится о подтипах, но в вашем случае процессор действительно заботится о подтипе и хочет сделать подтип конкретных вещей. Вы правы, что один из способов сделать это - проверить тип с помощью оператора instanceof и привести его, и да, это не очень элегантно.

Другой способ и, возможно, единственный способ, о котором я мог подумать, - это иметь другой метод с общим именем в CommonBase, такой как «делегат» или «процесс», без определения того, что он делает внутри, а затем обеспечить реализацию в подтипах. для этого метода.

interface CommonBase {
   void delegate();
}
class SubTypeA implements CommonBase {
   public void delegate() {
       //invoke actual method with proper name
   }
}
class SubTypeB implements CommonBase {
   public void delegate() {
       //invoke actual method with proper name
   }
}

Надеюсь, это поможет.

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