Изменение нескольких классов интерфейса, вопрос проектирования - PullRequest
0 голосов
/ 05 июня 2019

Допустим, у меня есть интерфейс с именем Parent

interface Parent{

void methodOne();
}

Этот интерфейс реализован в 10 различных дочерних классах, скажем

class Child1 implements Parent{
void methodOne();
}

class Child2 implements Parent{
void methodOne();
}
:
:
class Child10 implements Parent{
void methodOne();
}

Как добавить новый метод в интерфейс Parent иНе нарушайте другие 10 классов.

interface Parent{

void methodOne();
void methodtwo();
}

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

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Без реализаций по умолчанию вы не можете добавлять методы к интерфейсам без необходимости реализовывать их в каждом из реализующих классов. Обходной путь - заставить ваши классы расширять абстрактный класс, который, в свою очередь, реализует интерфейс. У вас будет что-то вроде этого:

public interface Parent {
    public void methodOne();
}

public abstract class AbstractChild implements Parent {
    //literally, leave blank
}

public class Child1 extends AbstractChild {
    public void methodOne() {
        //implementation goes here
    }
}

....

Теперь, если вы хотите добавить новые методы в интерфейс, вы можете реализовать их в вашем AbstractChild - и все классы ChildX не нужно трогать.

2 голосов
/ 05 июня 2019

Методы по умолчанию были введены, потому что если вы добавите новый метод в интерфейс, то все классы, реализующие этот интерфейс, будут выдавать ошибки, вынуждая вас реализовать новый метод внутри них, что означает разрыв классов, ноесли вы добавляете какой-либо новый метод в интерфейс, метод должен быть реализован всеми классами, которые реализуют интерфейс, если метод не объявлен по умолчанию.Как вы заметили, это было введено в Java 8, чтобы помочь в достижении обратной совместимости.Для получения дополнительной информации об этом вы можете проверить эту статью .Вы также можете проверить этот почти аналогичный вопрос, чтобы помочь вам из полученных ответов.Однако для предыдущих версий Java вы можете использовать абстрактный класс вместо интерфейсов, чтобы избежать взлома классов.

...