Реализовать интерфейс и переопределить методы в Java? - PullRequest
1 голос
/ 13 апреля 2011

Почему вы должны переопределить все методы интерфейса?

Например, если у меня есть

public class Foo extend JFrame implements ActionListener, KeyListener {
      foo(){
      }
    @Override
    public void keyPressed(KeyEvent arg) {          
    }

    @Override
    public void keyReleased(KeyEvent arg) {
}

    @Override
    public void keyTyped(KeyEvent arg) {        
    }
}

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

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

Ответы [ 6 ]

5 голосов
/ 13 апреля 2011

Конкретные классы всегда должны реализовывать все методы интерфейса. Если вы еще не продлеваете JFrame, вы можете продлить KeyAdapter. Он реализует пустые методы для KeyListener, чтобы избежать их выписывания. Вы можете использовать анонимный класс с этим внутри вашего Foo класса следующим образом:

addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
        // handle typed key here
    }
});
4 голосов
/ 13 апреля 2011

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

2 голосов
/ 13 апреля 2011

Если вы реализуете интерфейс, это означает, что реализованный объект может использоваться в любом сценарии, где ожидается реализация.С этой точки зрения совершенно очевидно, что вы должны реализовать все методы интерфейса, иначе вы не сможете сказать, что вы реализовали его.например, если у меня есть интерфейс ICalculator с методом Add и Subtract, и вы хотите реализовать только Add, может ли результирующий класс действительно использоваться другим проектом, которому требуется ICalculator?

Тем не менее, я вполне понимаю вашу гнев по поводу реализации некоторых интерфейсов в современных средах, поскольку они явно нарушают принцип сегрегации интерфейса .Это означает, что некоторые интерфейсы представляют собой наборы нескольких функций, которые можно использовать вместе, чтобы сделать что-то полезное.Например, если интерфейс ICalculator вместо простых Add, Divide и т. Д., Я начал добавлять методы, такие как StandardDeviation, которые не являются необходимыми для природы объекта Calculator.

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

2 голосов
/ 13 апреля 2011

Это именно то, для чего предназначен класс KeyAdapter: он реализует все методы интерфейса (но ни одна из реализаций ничего не делает). Поскольку вы не можете расширять два класса, вы должны использовать внутренний класс для слушателя (который в любом случае является более чистым):

public class Foo extend JFrame {
      foo(){
          ...
          component.addKeyListener(new MyKeyListener());
          ...
      }

    private class MyKeyListener extends KeyAdapter{
        @Override
        public void keyPressed(KeyEvent arg) {          
        }
    }
}
2 голосов
/ 13 апреля 2011

Вы можете создать родительский класс Foo, который имеет эти пустые методы и заставляет Foo реализовывать только те методы, которые вы хотите видеть.

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

0 голосов
/ 13 апреля 2011

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

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