Советы по методу реализации расширенного интерфейса - PullRequest
0 голосов
/ 20 сентября 2011

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

public interface StructureService {
    void delete(FileEntry entry);
}

public interface FileService extends StructureService {
     void dummy();
}

Классы, которые их реализуют, выглядят следующим образом:

public class DbStructureService implements StructureService {
    public void delete(FileEntry entry) {
    }
}
public class DbFileService extends DbStructureService implements FileService {
    public void dummy() {
    }
}

Я пытаюсь сопоставить метод удаления, но только для классов, реализующих FileService.

Я определил следующий аспект:

public aspect FileServiceEventDispatcherAspect {
    pointcut isFileService() : within(org.service.FileService+);

    pointcut delete(FileEntry entry) :
        execution(void org.service.StructureService.delete(..))
        && args(entry) && isFileService();

    void around(FileEntry entry) : delete(entry)  {
            proceed(entry);
    }
}

Проблема в том, что, пока у меня включен pointcut isFileService, он не будет соответствовать ни одному классу; хотя есть много методов, которые должны соответствовать этому

Если я заменю within(org.service.FileService+) на within(org.service.StructureService+), он также будет работать нормально.

Я пытался поэкспериментировать с этим () и так далее, но безуспешно. Как мне сделать это в aspectj?

EDIT: Обновлено, как выглядят классы, реализующие интерфейсы. Я думаю, что этот сценарий может быть трудно советовать, так как в DbFileService нет переопределенного метода

1 Ответ

1 голос
/ 21 сентября 2011

Полагаю, вы имеете в виду, что DbFileService реализует FileService, но не StructureService. Учитывая это, этот код должен работать:

public aspect FileServiceEventDispatcherAspect {    

pointcut delete(FileService this_, FileEntry entry) :
    execution(void org.service.StructureService.delete(..))
    && args(entry) && this(this_);

void around(FileService this_, FileEntry entry) : delete(this_, entry)  {
        proceed(this_, entry);
}
}

Точка вырезки "в пределах" здесь не подходит, потому что это "точка на основе лексической структуры" ( "AspectJ в действии", второе издание. )

...