Интерфейсы Полный справочник - PullRequest
1 голос
/ 25 октября 2011

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

"Интерфейсы предназначены для поддержки динамического разрешения методов во время выполнения. Обычно для вызова метода из одного класса в другой оба класса должны присутствовать во время компиляции, чтобы компилятор Java мог проверить, чтобы убедиться, что подписи метода совместимы. Это требование само по себе делает для статического и нерасширяемая среда классификации. В такой системе неизбежно, функциональность становится подниматься выше и выше в иерархии классов, так что механизмы будут доступно все больше и больше подклассов. Интерфейсы разработаны, чтобы избежать этой проблемы. Они отключают определение метода или набора методов от наследования иерархия. Поскольку интерфейсы находятся в другой иерархии от классов, это возможно для классы, которые не связаны с точки зрения иерархии классов для реализации "

Итак, что автор имел в виду, «как правило, для вызова метода из одного класса в другой»? Пожалуйста, оставьте свои взгляды.

Ответы [ 3 ]

4 голосов
/ 25 октября 2011

Это означает, что если вы не используете интерфейсы и пытаетесь сделать что-то вроде этого:

someObject.doSomething();

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

С другой стороны, если все, что вы знали о someObject, это то, что он реализует интерфейс с методом doSomething, то только компилятору должен быть доступен этот интерфейс, чтобы выполнять свою работу. Тогда кто-то другой может вызвать ваш скомпилированный код, передав некоторый объект, который находится в пакете, который не был доступен вам во время компиляции, если он реализует ваш интерфейс.

2 голосов
/ 25 октября 2011

Pavan,

Все это "Обычно для вызова метода из одного класса в другой" означает, что это "нормальный вызов метода", такой как:

Foo foo = new Foo();
foo.bar();  <<== method invocation

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

Мы помещаем «как вызвать этот метод» в файл интерфейса, отдельно от файла (ов) класса, который определяет «как работает этот метод» .

НО ПОЧЕМУ ???Реализующий класс может быть создан другим программистом в другой организации через годы после интерфейса.Новый класс будет работать с исходным кодом, потому что он предоставляет ожидаемый интерфейс .

Это немного понятнее?

Cheers Keith.


РЕДАКТИРОВАТЬ: Чтобы продолжить приведенный выше пример ... давайте представим, что третий симпозиум по универсальному формату обмена данными Publicans несколько лет назад опубликовал «стандартный интерфейс» (между напитками), чтобы позволить местным владельцам поддерживатьобщая база данных «проблемных пьющих»:

interface Barable {
    void bar();
}

А когда мы выгоняем преданного своему делу покровителя:

class Patron {
    void kickOut() {
        // ServiceLocator finds a class which implements the Barable interface.
        Barable service = ServiceLocator.ByInterface("Barable"); 
        service.bar(); <<-- Invoke it. We don't care HOW it works, or WHO implemented it!
    }
}
1 голос
/ 25 октября 2011

Интерфейс - это просто способ доступа к чему-либо.

Классы должны реализовывать интерфейс и предоставлять реализацию.

public interface Account{

openAccount();

deleteAccount();

}

public class AccountImpl implements Account{

 public void openAccount(){
  // create an account here
 }

 public void deleteAccount(){
  // create an account here
 }

}

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

public class AccountImpl{
     public void openAccount(){
      // create an account here
     }

     public void deleteAccount(){
      // create an account here
     }
} 

Не каждый класс должен иметь интерфейс для реализации.

Например, в мире JDBC oracle предоставляет интерфейс, но разные поставщики баз данных предоставляют реализацию класса драйверов. Итак, для того, чтобы вы вызвали метод конкретного поставщика базы данных для доступа к базе данных. Вам необходимо знать сигнатуру метода или «контракт», чтобы придерживаться, но базовая реализация принадлежит отдельному классу.

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