интерфейс только для определенных классов? - PullRequest
5 голосов
/ 24 августа 2009

Можно ли создать интерфейс, который можно применять только к определенным классам и подклассам?

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

Это кажется неуклюжим. Какой лучший способ сделать это?

Ответы [ 3 ]

7 голосов
/ 24 августа 2009

Очевидное решение - добавить в интерфейс метод, который возвращает компонент (который может быть this).

JComponent getComponent();

Или даже обобщить ваш интерфейс:

 public interface MyInterface<C extends JComponent> {
     C getComponent();
     [...]
 }

Это не очень хороший дизайн, но он должен работать.

2 голосов
/ 24 августа 2009

Могут быть сценарии, в которых это не будет работать, но использование обобщений позволяет указать несколько типов:

interface Foo { void frobulize(); }

class Bar {
    <T extends JComponent & Foo> String doFoo(T obj){
        obj.frobulize();
        return obj.getToolTipText();
    }
}

Если вы хотите, чтобы объекты были полями непараметризованного типа, вы добавляете параметры типа в конструктор (малоизвестная особенность, которая непонятно удивляет ваших коллег):

class Quux {
    private final Foo foo;
    private final JComponent component;
    public <T extends JComponent & Foo> Quux(T fc){
        foo = fc;
        component = fc;
    }
}
0 голосов
/ 24 августа 2009

Зачем вы это делаете?

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

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

...