Реализовать интерфейс и переопределить методы в Java?
Почему вы должны переопределить все методы интерфейса?
Например, если у меня есть
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 ответов
Конкретные классы всегда должны реализовывать все методы интерфейса. Если вы еще не расширяли JFrame
Вы могли бы продлить KeyAdapter
, Он реализует пустые методы для KeyListener
чтобы не писать их. Вы можете использовать анонимный класс с этим внутри вашего Foo
класс как это:
addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
// handle typed key here
}
});
Интерфейсы не имеют реализации по умолчанию. Если вы не были вынуждены реализовывать каждый метод в интерфейсе, что произойдет, если какой-то другой код попытается вызвать эти методы через интерфейс?
Это именно то, что KeyAdapter
Класс предназначен для: он реализует все методы интерфейса (но ни одна из реализаций ничего не делает). Поскольку вы не можете расширять два класса, вы должны использовать внутренний класс для слушателя (который в любом случае является более чистым):
public class Foo extend JFrame {
foo(){
...
component.addKeyListener(new MyKeyListener());
...
}
private class MyKeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent arg) {
}
}
}
Если вы реализуете интерфейс, это означает, что реализованный объект может использоваться в любом сценарии, где ожидается реализация. С этой точки зрения совершенно очевидно, что вы должны реализовать все методы интерфейса, иначе вы не сможете сказать, что вы реализовали его. например, если у меня есть ICalculator
интерфейс с Add
а также Subtract
метод, и вы хотите только реализовать Add
Может ли полученный класс действительно использоваться другим проектом, которому нужен ICalculator?
Тем не менее, я вполне понимаю ваш гнев по поводу реализации некоторых интерфейсов в современных платформах, поскольку они явно нарушают принцип сегрегации интерфейсов. Это означает, что некоторые интерфейсы представляют собой наборы нескольких функций, которые можно использовать вместе, чтобы сделать что-то полезное. Например, если интерфейс ICalculator, а не просто основной Add
, Divide
и т. д. методы, я начал добавлять методы, такие как StandardDeviation
которые не являются существенными для природы Calculator
объект.
Суть в том, да, вы должны реализовать каждый из членов интерфейса, однако, если вы уверены и знаете, что некоторые из них никогда не будут использоваться, не стесняйтесь оставлять их пустыми, или даже лучше, заставляйте их генерировать исключения, так что вы будете уверены, что никогда не значит никогда.
Вы можете создать родительский класс Foo, который имеет эти пустые методы и в котором Foo реализует только те методы, которые вы хотите видеть.
Когда вы реализуете интерфейс, вы должны реализовать все его методы где-то для создания конкретного объекта.
Вы действительно должны взять хорошую книгу об объектно-ориентированном программировании и вернуться к первым главам. Интерфейс - это полностью абстрактное определение методов, поэтому вы не можете реализовать интерфейс частично.