2011-04-13 4 views
0

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

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

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) {   
    } 
} 

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

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

ответ

5

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

addKeyListener(new KeyAdapter() { 
    public void keyTyped(KeyEvent e) { 
     // handle typed key here 
    } 
}); 
+0

Я могу расширить только один класс? – AlanFoster

+0

Да, вы можете продлить только один класс. Вам придется разделить вашу ключевую логику на отдельный класс, который расширяет «KeyAdapter». Тогда вам нужно будет написать только один метод, который вы хотите переопределить. – WhiteFang34

0

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

4

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

2

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

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

2

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

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

    private class MyKeyListener extends KeyAdapter{ 
     @Override 
     public void keyPressed(KeyEvent arg) {   
     } 
    } 
} 
+0

Хотел бы я дать два правильных ответа. В качестве вопроса, как я могу добавить это к самому JFrame, потому что добавление его в getContentPane() не работает - обратите внимание, что он работает на JTextField, хотя – AlanFoster

+0

@ user551841: KeyListeners работают только с компонентами, которые фактически получают клавиатуру фокус. Для глобального прослушивания ключевых событий вам, вероятно, придется работать с KeyEventDispatcher, или если это только определенные ключи, которые вас интересуют (например, горячие клавиши), используйте привязку клавиш. Прочтите учебные пособия для получения дополнительной информации: http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html –

2

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

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

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