Когда не все ваши функции полиморфны

1

От старого экзамена без решения:

Учитывая этот код....

import java.util.*;

public class AClass {
    private int f(List<Integer> list){
        int i = 0;
        //Something useful
        return i;
    }
    public int g() {
        List<Integer> myList = new LinkedList<Integer>();
        return f(myList);
    }   
}

Обратите внимание, что метод f является полиморфным, т.е. Ему может быть передана любая реализация интерфейса List. С другой стороны, метод g не является. Поскольку он myList объект myList, он не может этого сделать, не зная его типа. Следовательно, он не может быть полиморфным. Наш код содержит много методов, страдающих одной и той же проблемой. Мы стремимся сделать наш код полиморфным.

  1. Как называется стандартное решение этой проблемы?
  2. Опишите это в этом случае
Теги:

3 ответа

2
  1. Свободная связь Существует много способов решить эту проблему среди них: программа для интерфейсов и применение инъекции зависимостей

  2. Метод g() тесно связан с LinkedList потому что метод явно создает экземпляр этого объекта, который, следовательно, является жестким для этого класса. Если вы хотите, например, использовать ArrayList вам нужно открыть класс и явно изменить метод и потенциально ввести ошибки. Кроме того, вам, вероятно, придется пройти тестирование и документацию. С другой стороны, метод f() является более гибким, поскольку вы можете просто передать нужную вам коллекцию, а метод не имеет понятия о конкретной реализации, которую вы передаете, тем самым закрывая ваш метод.

  • 1
    1. Альтернативно: программирование для интерфейса. Слабая связь является более всеобъемлющей.
  • 0
    Хороший ответ. Всегда лучше использовать нужный интерфейс ( List ), а не конкретную реализацию ( LinkedList , ArrayList т. Д.). Вместо этого вы всегда можете использовать класс позже, если вам нужно использовать методы, специфичные для него, которые не были определены в интерфейсе.
Показать ещё 6 комментариев
0

По-видимому, решением в этом случае было бы создание Abstract Factory Pattern.

Например, мы должны создать новый класс под названием AClassCreator и создать метод createAClass(List<?> list) где параметр является подклассом списка.

0
Consequently, it cannot be polymorphic. Our code contains many methods suffering from the same problem. We aim to make our code polymorphic.

Что ты имеешь в виду? Просьба привести примеры. Единственный способ сделать этот код более универсальным - использовать Collection или Iterable вместо List, но я бы сказал, что это избыток в терминах свободной связи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню