3

有可能以这样的方式结束:

    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 类中的其余内容。那么还有其他可行的方法吗?

4

2 回答 2

2

我也不完全理解这个问题。

正如 Arvice 所说,Concerns 相当于 AOP 中的环绕建议,具有更精确的切入点语义。尽管从技术上讲,关注点“包装”了潜在的关注点/mixin,但我更愿意不将其视为“包装器”,而是“拦截器”。处理的是来电。概念上略有不同,它可能并不适用于所有人。

Concerns(无状态)和 Mixins(有状态)也可能只实现它们覆盖的接口中方法的子集,只需将类设为“抽象”即可。Qi4j 将填补缺失的(和未使用的)方法调用。并且可以使用任何组合。

此外,实施良好的关注点应该称为“下一个”,因为它们应该不知道它们的实际用途。如果关注点需要处理方法调用。每个复合类型方法都必须有一个 Mixin,否则组装将失败。

简而言之;1. Mixin 实现可以实现零个(也称为私有 mixins),一个或多个复合类型接口的方法。2. Concern 可以实现复合类型接口的一个或多个方法。

还有趣的是,当一个类(mixin 或关注点)调用它自己的一个在复合类型接口中的方法时,调用不会是类内的,而是从外部调用复合的,所以整个调用调用堆栈,以确保内部调用和外部调用的结果相同。如果需要绕过,则存在模式。

于 2013-09-17T16:54:21.200 回答
2

我不确定我是否理解您要做什么,但是应该将关注点更多地视为围绕它关注的类的原始实现的包装器。正如文档所述:

关注点是在调用之间共享的无状态片段,它充当对 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";
   }
}

希望这有帮助。

于 2013-09-17T07:50:37.967 回答