2010-09-17 3 views
3

Если я ставлю:Aspectj. Создание методов типа innter в нескольких классах

public CountryState CountryState.find(long id) { 
     return (CountryState) findById(CountryState.class, id); 
} 

Я создаю метод поиска в классе CountryState.

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

Я знаю, что с точки зрения я могу наследовать класс от другого, но, делая это, я могу создать один суперкласс, потому что java не принимает множественное наследование.

ответ

5

Этот «образец» то, как вы это делаете в AspectJ.

Объявите интерфейс:

interface Holder {} 

сделать ваши объявления интертипных на интерфейсе:

public int Holder.getMeAnInt() { 
    return 42; 
} 

Когда вы делаете заявление, как и на интерфейсе вы предоставляете «реализацию по умолчанию». Таким образом, интерфейс теперь будет определять getMeAnInt(), и любые реализации Holder, которые не реализуют getMeAnInt(), получат реализацию по умолчанию.

Заключительная часть головоломки затем использовать объявить родителям определить, какие группы типов реализовать интерфейс:

declare parents: @Anno * implements Holder; 

Итак, любой тип помечается @Anno будет осуществлять Holder и иметь getMeAnInt ().

+0

Энди, это именно то, что мне нужно. Отлично! большое спасибо! –

0

Вы действительно можете решить проблему без использования АОП. Вы можете использовать OOP/OOD. Есть два способа (я предполагаю, что вы хотите написать метод один раз):

  1. Создать абстрактный базовый класс с реализацией метода и получить все классы от него. На самом деле это не лучшая идея.

  2. Создание класса-помощника, который будет реализовывать ваш метод find() и делиться им между классами (либо с использованием Dependency Injection, либо просто путем их плотного соединения).

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

public <T> find(long id, T targetClassObject) { 
    Class<? extends T> class = targetClassObject.getClass(); 
    // do something i.e. call target method via reflection 
} 
+0

См. Мой второй пост.http: //stackoverflow.com/questions/3738545/aspectj-creating-intter-type-methods-in-multiple-classes –

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