Java: нет реализации интерфейса? - PullRequest
0 голосов
/ 29 января 2009

Сегодня я получил мою книгу "Head First Design Patterns" по почте. Пока довольно интересные вещи, но у меня есть вопрос по поводу их содержания.

У меня нет фона Java / C #, и я не хочу сейчас переходить на эти языки (сначала я пытаюсь сосредоточиться на C ++). В книге говорится, что в Java нет реализации интерфейсов ... Это будет означать, что для каждого изменения этого интерфейса вам придется изменять все подклассы, которые реализуют интерфейс.

Как это делается в C ++? Чего мне не хватает?

Ответы [ 6 ]

8 голосов
/ 29 января 2009

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

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

У меня сложилось впечатление, что вы не совсем понимаете, как работают интерфейсы, поэтому я предлагаю прочитать спецификацию интерфейса C # на MSDN , которая, как мне кажется, совершенно ясна по этому вопросу ( то же самое в Java, за исключением того, что в Java вы используете ключевое слово " Implements " вместо двоеточия (:), чтобы объявить, что класс реализует определенный интерфейс).

2 голосов
/ 29 января 2009

... если вы хотите изменить сигнатуру метода в интерфейсе, хорошая IDE (eclipse, netbeans ...) может помочь вам с рефакторингом всех классов, реализующих этот интерфейс.

1 голос
/ 29 января 2009

В C ++ такая же ситуация.

C ++ не имеет ключевого слова интерфейса, но чисто виртуальный класс со всеми чисто виртуальными методами - та же идея.

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

1 голос
/ 29 января 2009

С ++-эквивалент Java-интерфейса будет классом только с чисто виртуальными методами.

Вы упомянули, что «вы видели множество этих интерфейсов Runnable / Threadable, которые можно изменять, не касаясь этих подклассов» Трудно сказать наверняка по вашему описанию, но то, что вы могли видеть раньше, выглядит примерно так:

Runnable r = new Runnable() {
    public void run() {
        // do something here
    }
};

Это анонимный класс, реализующий интерфейс Runnable; это никак не изменяет интерфейс.

0 голосов
/ 30 января 2009

Хорошо, я задам очевидный вопрос:

Если вы хотите создавать шаблоны проектирования в C ++, зачем вам читать что-либо, кроме оригинальной «Банды четырех» Шаблоны проектирования книга?

И да, класс C ++ с чисто виртуальными методами эквивалентен интерфейсу Java или C #.

0 голосов
/ 29 января 2009

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

Да, если вы измените интерфейс - вам придется изменить все классы, которые реализуют этого интерфейса. Я предполагаю, что экземпляры Runnable, которые вы видели бы в коде Java, являются анонимными классами, которые фактически реализуют Runnable, а не изменяют сам интерфейс.

Runnable myOwnThread = new Runnable() {
  public void run() {
   // Do something here
  }
};

В Java запрещается изменять интерфейсы (и классы), предоставляемые в стандартной библиотеке. Эквивалентом в C ++ может быть чистый виртуальный класс .

...