Qi4J касается частичной реализации
Это возможно сделать в конечном итоге что-то вроде этого:
ServiceChild (class) extends (or only partial implements) Service and overrides sayHello
Service (interface) implements hello,goodbye
Hello (has a mixin HelloMixin) has method sayHello
Goodbye (has a mixin GoodbyeMixin) has method sayGoodbye
Я попытался сделать выше, используя подход озабоченности в ServiceChild
public class ServiceChild extends ConcernOf<Service> implements Hello
{
@Override
public String sayHello() {
return "Rulle Pharfar";
}
}
Однако, используя этот подход, java обнаруживает только реализацию Hello, а не все остальное из класса Service. Так есть ли другой подход, который будет работать?
2 ответа
Я также не до конца понимаю вопрос.
Как говорит Арвице, проблемы являются эквивалентом общего совета в АОП с гораздо более точной семантикой точечного реза. Хотя технически правильно, что проблема "оборачивает" основные проблемы / миксины, я предпочитаю не думать о ней как об "обертке", а как о "перехватчике". Это входящий звонок, который обрабатывается. Концептуально немного отличается, и это не может работать для всех.
Также возможно, что оба параметра Concern (без сохранения состояния) и Mixins (с сохранением состояния) реализуют только подмножество методов в интерфейсе, который они переопределяют, просто делая класс "абстрактным". Qi4j будет заполнять пропущенные (и неиспользуемые) вызовы методов. И любая комбинация может быть использована.
Кроме того, хорошо реализованные проблемы должны называться "следующим", потому что они не должны знать о своем фактическом использовании. Если ожидается, что проблемы позаботятся о вызове метода. Должен быть Mixin для каждого метода составного типа, иначе сборка не удастся.
Короче говоря; 1. Реализация Mixin может реализовать ноль (или частные миксины), один или несколько методов интерфейса составного типа. 2. Концерн может реализовывать один или несколько методов интерфейса составного типа.
Также интересно отметить, что когда класс (mixin или беспокойство) вызывает один из своих собственных методов, которые находятся в интерфейсе составного типа, вызов не будет внутриклассовым, но вызовет составной извне, поэтому весь вызов стек вызывается, чтобы гарантировать, что внутренний вызов и внешний вызов идентичны в результатах. Шаблоны существуют, если это нужно обойти.
Я не уверен, что понимаю, что вы пытаетесь сделать, но больше беспокойства следует рассматривать как обертку вокруг первоначальной реализации класса, к которому это относится. Как указано в документации:
Беспокойство - это фрагмент без состояния, который разделяется между вызовами и действует как перехватчик вызова в Mixin.
И обычно делал бы это:
//Given interface MyStuff
@Mixins( MyStuff.Mixin.class )
@Concerns( MyStuffConcern.class )
public interface MyStuff
{
public void doStuff();
abstract class Mixin implements MyStuff
{
public void doStuff()
{
System.out.println( "Doing original stuff." );
}
}
}
public class MyStuffConcern extends ConcernOf<MyStuff>
implements MyStuff
{
public void doStuff()
{
// if I want to do anything before going down the call chain I'll do it here
System.out.println( "Doing stuff before original." );
// calling the next concern or actual implementation
next.doStuff();
// anything to do after calling down the call chain - here is the place for it
System.out.println( "Doing stuff after original." );
}
}
Но тем не менее, если у вас есть проблемы с интерфейсом, вы должны также реализовать указанный интерфейс:
public abstract class ServiceChild extends ConcernOf<Service> implements Service
{
public String sayHello()
{
return "Rulle Pharfar";
}
}
Надеюсь, это помогло.