Подтвердить что ты не робот

Что означает функция для возврата интерфейса?

Я только что увидел функцию-член как это:

public Cat nextCat(GameState state); 

Но Cat - это такой интерфейс:

public interface Cat {
        void makeCat(GameState state);
}

Итак, я смущен тем, как это интерпретировать. Я знаю, что это значит, когда что-то возвращает объект или примитив. Но что значит вернуть интерфейс? Как использовать возвращаемое значение этой функции?

4b9b3361

Ответ 1

Подумайте об этом: если Cat, где обычный класс, какой точно вам будет интересно, когда вы хотите вызвать на нем некоторые методы?

Вам понадобятся определения метода: их имена, их типы аргументов, их возвращаемые значения. Вы не должны заботиться о реальной реализации!

Так как интерфейс предоставляет все это, вы можете вызывать на нем методы, как вы можете на обычном классе.

Конечно, для того, чтобы метод фактически возвращал некоторый объект, должен быть некоторый класс, который где-то реализует этот интерфейс. Но какой класс на самом деле или как он реализует эти методы, не имеет никакого значения для кода, который возвращает этот объект.

Другими словами, вы можете написать такой код:

Cat cat = nextCat(GameState.STUFF);
cat.makeCat(GameState.OTHER_STUFF);

Этот код не знает конкретного типа, который реализует интерфейс Cat, но он знает, что объект может делать все, что требует интерфейс Cat.

Ответ 2

Эта функция возвращает объект класса, который реализует интерфейс Cat. Детали реализации (для этого конкретного класса) зависят от вас, если вы реализуете для него все методы интерфейса Cat.

Ответ 3

Например, вы можете сделать это:

interface Cat {
    String meeeeow();
}

public Cat nextCat(GameState state) {
    return new Cat() {
        public String meeeeow() {
            return "meeeeeeeeeow!!!!";
        }
    };
}

и в этом случае метод nextCat возвращает реализацию интерфейса Cat с помощью "anonymous-internal-class". Это показывает, что код, вызывающий nextCat, не должен знать, какой код реализует возвращенный интерфейс Cat. Это пример одной из ключевых преимуществ объектно-ориентированного программирования: поскольку вызывающий код не знает реализации, влияние изменения реализации позже мало (при условии, что интерфейс остается тем же).

Ответ 4

Это один из способов абстракции, "Hiding Actual implementation", лучший пример - это Map интерфейс, где, если какой-либо API имеет возвращаемый тип как Map, тогда пользователю фактически не нужно заботиться о типе реализации объекта, т.е. "Hasmap for Hashtable". С помощью методов, определенных в интерфейсе Map, пользователь может выполнять операцию над возвращенным объектом, потому что интерфейс создает контракт с классами реализации, которые "класс реализации должен обеспечивать защиту для объявленного метода", иначе объявить, что реализующий класс как abstract.

Ответ 5

Метод не может возвращать ничего (void) или примитивное значение int, double,...) или ссылку, которая является либо нулевой, либо ссылается на экземпляр. Когда метод возвращает ссылку, это объявленный как возвращающий ссылку на какой-то конкретный вид объекта.

В вашем случае ссылка, возвращаемая этим методом, будет либо нулевой, либо будет ссылаться на объект, класс которого реализует Cat

Ответ 6

Методы не возвращают интерфейсы или классы. Они возвращают ссылку на экземпляр (= объект) или null (или примитивное значение, но позволяют вставлять объекты). Эта ссылка обычно либо хранится в переменной, либо используется для вызова методов экземпляра или доступа к экземплярам экземпляра.

Объявленный тип возврата указывает нам наименее специфический тип реального экземпляра, ссылка на который возвращается методом. Объектом этой ссылки может быть именно этот тип или любой подкласс (или под-подкласс,...).

Ответ 7

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

Cat cat = nextCat(state);
cat.makeCat(state);

Ответ 8

Это означает, что функция-член может возвращать любую реализацию. Это следует за "Программой к интерфейсу, а не реализацией". шаблон дизайна.

Ответ 9

В соответствии с объектно-ориентированным определением интерфейс представляет собой группу связанных методов с пустыми телами. Интерфейсы заключают контракт между классом и внешним миром, и этот контракт применяется во время сборки компилятором. Сказав, что nextCat(GameState state) возвращает интерфейс Cat, что означает, что во время выполнения он может возвращать любой объект, который реализует Cat. Теперь это не так гибко? Клиенты не знают о конкретных типах объектов, которые они используют, пока объекты придерживаются интерфейса, ожидаемого клиентами.

Ответ 10

Еще раз подчеркнем, что это совершенно легально, а на самом деле очень распространено - иметь переменные, тип которых является интерфейсом, например:

Measurable meas;  //"Measurable" is an interface name.


      Просто помните, что объект, к которому относится meas, не имеет типа Measurable.
В       факт, ни один объект не имеет типа Измеримый. Вместо этого, тип объекта - это некоторый класс, который       реализует измерительный интерфейс. Это может быть объектом класса BankAccount или       Класс монеты или какой-либо другой класс.

    meas = new BankAccount(1000); // OK 
    meas = new Coin(0.1, "dime"); // OK

Что вы можете сделать с переменной интерфейса, учитывая, что вы не знаете класс       объект, на который он ссылается?
Вы можете вызвать методы интерфейса:

double m = meas.getMeasure();

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

Ответ 11

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