Есть ли способ избежать одновременной реализации двумя конкретными интерфейсами класса? - PullRequest
0 голосов
/ 25 мая 2018

Есть ли способ избежать одновременной реализации классом двух специфических интерфейсов в Java?

Если, например, у меня есть 2 вида объектов: Movable объекты и Motionless объекты.Тогда у меня есть класс Car, который реализует Movable.Как я могу избежать реализации Motionless, если он уже реализует Movable?

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

Ответы [ 5 ]

0 голосов
/ 25 мая 2018

Вы можете сделать это, если каждый интерфейс объявит метод с несовместимым типом возврата.

Например, один интерфейс может объявить void метод someMethod, а другой может объявить его как тип int.

Если вы сделаете их default, то реализующие классы не должны будут реализовывать их напрямую, и нет никакого способа, которым класс мог бы успешно реализовать оба.

например

public interface A {
    default void someMethod() {}
}

public interface B {
    default int someMethod() {
        return 0;
    }
}

public class Test implements A, B
{
    // Can't make this work since we cannot successfully override
    // both default methods due to the different return types.
    @Override
    public void someMethod()
    {
        // TODO Auto-generated method stub
        A.super.someMethod();
    }
}
0 голосов
/ 25 мая 2018

Как другой ответ, вы не можете сделать это в Java.Поскольку у каждого метода есть сигнатура, и с этим у вас две одинаковые сигнатуры, и поэтому он выдаст ошибку компиляции.Проверьте документы Подпись метода

0 голосов
/ 25 мая 2018

Вы не можете сделать это.Вы можете сделать один из следующих

  1. Сделать Movable и Motionless абстрактные классы.
  2. Сделать Movable и Motionless package-private и поместить их в разные пакеты,Но это заставит все их реализации быть в одном пакете.
0 голосов
/ 25 мая 2018

Нет никакого способа заставить это в Java.

Вы можете принудить то же самое, изменив свой API для использования абстрактных классов вместо интерфейсов:

abstract class Movable{}
abstract class Motionless{}

Только один из двухмогут быть унаследованы одновременно.

0 голосов
/ 25 мая 2018

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

В некоторых случаях стоит упомянуть об этом в Javadoc;например, Javadoc для java.util.Set упоминает, что его спецификация 'equals' является взаимоисключающей со спецификацией java.util.List.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...