Возможность реализовать интерфейс только тогда, когда класс наследует от определенного класса - PullRequest
2 голосов
/ 06 мая 2011

Я программирую с Java. Допустим, у меня есть интерфейс «MyInterface» и абстрактный класс «MyClass».

Я хочу убедиться, что каждый класс, реализующий интерфейс "MyInterface", унаследован от "MyClass". Унаследованный класс от MyClass вполне способен НЕ реализовывать интерфейс «MyInterface».

Возможно ли это? Благодарю. Извините, если мой английский плохой, но я французский.

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

Я хочу убедиться, что каждый класс, реализующий интерфейс "MyInterface", унаследован от "MyClass".

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

1 голос
/ 06 мая 2011

AFAIK, вы не можете сделать это напрямую.

Обобщения позволяют вам сказать что-то вроде этого, если это поможет:

public <T extends MyClass & MyInterface> void foo(T param) { /**/ }

Таким образом, вы можете вызывать foo () только с параметрами, которые являются одновременно MyClass и MyInterface.

Или, почему бы не иметь два абстрактных базовых класса?

abstract class MyClass { /* stuff here */ }
abstract class MyInterfaceClass extends MyClass { /* empty */ }

Затем используйте MyInterfaceClass вместо MyInterface.

Или, если вы просто заботитесь о контейнерах, напишите свой собственный:

static class MyList extends ArrayList<MyInterface> {
    @Deprecated
    public boolean add(MyInterface obj) {
        assert obj instanceof MyClass;
        return super.add(obj);
    }

    public <T extends MyClass & MyInterface> boolean add(T obj) {
        return super.add(obj);
    }
}

Затем вы получите предупреждение об устаревании в любое время, когда допустите ошибку.

Но мой вопрос остается - какую проблему вы пытаетесь решить? Можете ли вы использовать более описательные имена вместо «Класс» и «Интерфейс»? Возможно, правильное решение - это нечто совершенно другое.

0 голосов
/ 06 мая 2011

Нет, это невозможно. Любой класс может реализовать MyInterface. Не существует способа ограничить разработчиков подклассами MyClass.

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

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