метод интерфейса Java, удаляющий из подкласса - PullRequest
0 голосов
/ 21 октября 2019

Кто-нибудь предоставит предложение для ниже упомянутого:

в java8 рассмотрим интерфейс, имеющий два метода (например, interface1, interface 2), реализующих их для многих подклассов, позже я хочу удалить один метод interface1 из одного из моих подклассов безвлияет на других, есть ли какое-нибудь возможное решение?

Ответы [ 3 ]

1 голос
/ 21 октября 2019

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

public interface YourInterface {
    void method1();
    void method2();
}

public class YourSubClass implements YourInterface {
    @Override
    public void method1() {
        // actually do something
    }

    @Override
    public void method2() {
        throw new UnsupportedOperationException("method2() is not supported here.");
    }
}

Здесь, пока мы реализуем все методы, мы бросаемисключение во время выполнения, если вызывающий пытается получить доступ к method2().

0 голосов
/ 21 октября 2019

Зависит от того, как вы определяете «удалить один метод».

Если у вас есть интерфейс

interface Interface{
    void interface1();
    void interface2();
}

И, например, два подкласса, которые расширяют его:

 class Class1 implementes Interface {
     @Override
     public void interface1(){ ... }
     @Override
     public void interface2(){ ... }
 }
 class Class2 implementes Interface {
     @Override
     public void interface1(){ ... }
     @Override
     public void interface2(){ ... }
 }

Тогда есть два сценария:

  1. Вы не хотите реализовывать, например, метод interface1 () в Class2:
  2. Вы не хотите иметь метод interface1 () в Class2

В случае 1. Как упоминал Робби Корнелиссен, вы можете просто предоставить реализацию по умолчанию в Интерфейсе:

default void interface1() { /*do default thing*/ }

В случае 2. вам необходимо удалить interface1 ()Метод из интерфейса.

Это можно сделать, просто переместив определение метода interface1 () в Class1 (и любой другой подкласс, который должен иметь его). но это не совсем общий подход.

Лучше всего извлечь, например, Interface1 с методом interface1 () и использовать этот интерфейс в классах, которым нужен этот метод. Вы окажетесь в такой ситуации:

interface Interface{
    void interface2();
}
interface Interface1{
    void interface2();
}

И, например, два подкласса, которые расширяют его:

 class Class1 implementes Interface, Interface1 {
     @Override
     public void interface1(){ ... }
     @Override
     public void interface2(){ ... }
 }
 class Class2 implementes Interface {
     @Override
     public void interface2(){ ... }
 }
0 голосов
/ 21 октября 2019

Вы можете сделать это, предоставив реализацию по умолчанию метода для метода interface1 в самом интерфейсе.

interface Interface {
    default void interface1() {
        System.out.println("interface1");
    }

    void interface2();
}

class Clazz implements Interface {
    @Override
    public void interface2() {
        System.out.println("interface2");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...