Я изучал шаблоны проектирования Java, чтобы сделать свои проекты более организованными, мне нужно знать одну вещь: если следующий метод является хорошей практикой.
При использовании родительского абстрактного класса или интерфейса методы для подклассов определяются в родительском.
Моя проблема в том, что когда у меня есть куча подклассов, если каждый переопределяет метод A в родительском, но у одного из подклассов должен быть свой метод B, рекомендуется ли определять метод B в родительском классе даже если он используется только для этого подкласса.
Это ставит проблему, что methodB нужно будет использовать в каждом подклассе, даже если он никогда не вызывается из этого класса.
Должен ли я сделать это? Это не кажется правильным.
Пример кода:
public interface Parent{
public void methodA();
//Should this method be in the parent as it is only used once?
public void methodB();
}
подклассы:
public class First implements Parent{
@Override
public void methodA(){
System.out.println("This is method A");
}
// Does Nothing but java must have it used in the sub class
@Override
public void methodB(){
throw new UnsupportedOperationException("Do not call methodB from class First!!");
}
}
public class Second implements Parent{
@Override
public void methodA(){
System.out.println("This is method A");
}
// methodB is being used for this sub-class
@Override
public void methodB(){
System.out.println("This is method B");
}
}
Как вы можете видеть из приведенного выше кода, я использую methodB только для второго подкласса, но мне все еще необходимо использовать его в первом подклассе, иначе выдается исключение. Поскольку этот метод никогда не должен вызываться внутри первого класса, я просто выбрасываю исключение с сообщением. Это кажется неорганизованным. Это определенно неправильное использование наследства.
Если я использую только methodB во втором классе, не добавляя его к родителю:
public static void main(String[] args) {
Parent p = new Second();
p.methodA() // Prints "This is method A"
p.methodB() // throws an error
}
Кто-нибудь знает, как я могу вызвать определенный метод в классе, не выдавая ошибку. Добавление метода к родителю - определенно плохая практика.
EDIT:
Спасибо за все быстрые ответы, я обнаружил, что вместо этого можно определить разные интерфейсы:
interface X {
public void A()
}
interface Y extends X {
public void B()
}
class First implements X {
@Override
public void A();
}
class Second implements Y {
@Override
public void A();
@Override
public void B();
}
Если это все еще неправильно, пожалуйста, скажите мне.