2012-03-01 2 views
7

Предположим, у меня есть интерфейс под названием Interface, а конкретный класс Base, который, чтобы сделать что-то более сложным, имеет ctor, который требует некоторых аргументов.Аноним, расширяющий класс и реализующий интерфейс в одно и то же время?

Я хотел бы создать анонимный класс, который расширяет Base и реализует интерфейс.

Что-то вроде

Interface get() 
{ 
    return new Base (1, "one") implements Interace() {}; 
} 

Это выглядит разумным для меня, но это не работает!

(P.S: На самом деле, интерфейс и база также общие классы.: D Но я игнорировать, что на данный момент)

+0

Generic материал может стать кошмарами, если есть слишком много абстракции. Держите его просто;) –

ответ

1

Этот сценарий имеет мало смысла для меня. Вот почему: предположим, класс Base это:

class Base { 
    public void foo(); 
} 

и Interface это:

interface Interface { 
    public void bar(); 
} 

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

class MyClass extends Base implements Interface { 
} 

это означало бы, что MyClass наследует (или возможно переопределяет) метод bar от Base и должен реализовать m этод foo от Interface. Пока все хорошо, ваш класс имеет эти два метода в любом случае.

Теперь подумайте, что произойдет, когда вы возвращаете объект типа Interface из своего метода: вы получаете только ту функциональность, которую предлагает Interface, а именно метод foo. bar потерян (недоступен). Это подводит нас к двум делам:

  1. Расширение Base бесполезно, потому что вы не можете использовать свои методы, так как новый объект рассматривается как Interface.
  2. Interface также имеет метод foo, но это означало бы, что Base сам должен реализовать Interface, так что вы можете просто расширить Base непосредственно:
class Base implements Interface { 
    public void foo(); 
    public void bar(); 
} 

class MyClass extends Base { 
} 
+0

Ну, я предполагаю, что цель «реализует интерфейс» - это просто выполнить бросок. Я буду использовать конкретные примеры. У меня есть ViewClass, который расширяет класс Collection. Затем я использую этот ViewClass для реализации набора ключей и набора значений. Предположим, я каким-то образом получил все реализации в ViewClass, что означает, что мне технически не нужно вводить лишний код для набора ключей или значений. Единственное, что осталось позаботиться, это тип. Очевидно, что keySet() должен возвращать набор, а values ​​() должен возвращать коллекцию. Итак, если сказать другим способом, могу ли я сделать [return (Set ) new Base (...)]? – user113454

+0

Каким образом анонимный пользователь MyClass? У него есть имя! –

+0

@ Jon Skeet, точно, я использовал имя, чтобы я мог ссылаться на него в объяснении. – Tudor

11

Нет, вы не можете сделать это с анонимным классом. Вы можете создать именованный класс в рамках метода, если вы действительно хотите, хотя:

class Base { 
} 

interface Interface { 
} 

public class Test { 
    public static void main(String[] args) { 
     class Foo extends Base implements Interface { 
     }; 

     Foo x = new Foo(); 
    } 
} 

Лично я обычно вытащить это из в статический вложенный класс сам, но это ваш выбор ...

+0

Я не знал, что у нас может быть класс внутри метода !!! – user113454

+0

@ user1064918: Он редко используется, и не без оснований - его трудно прочитать. –

+0

@JonSkeet У меня это настроено, я не знаю другого способа сделать, чем использовать именованные классы внутри метода. Они используются только для того, чтобы тип-литье удовлетворяло ожидаемому типу. https: //gist.github.com/imminent/5248440 Мне интересно, знаете ли вы по-другому или думаете, что это законное использование именованных классов с помощью метода. –

Смежные вопросы