是可以这样结束的
: 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
我尝试使用服务儿童中的关注方法执行上述操作
public class ServiceChild extends ConcernOf<Service> implements Hello
{
@Override
public String sayHello() {
return "Rulle Pharfar";
}
}
但是,使用这种方法时,java 只会检测到 Hello 实现,而不会检测到 Service 类中的其余内容。那么还有其他可行的方法吗?
我不确定我是否理解您要做什么,但是应该更多地将关注点视为对它所关注的类的原始实现的包装器。如文档所述:
关注点是在调用之间共享的无状态片段,它充当对 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";
}
}
希望这有帮助。
我也不完全理解这个问题。
正如Arvice所说,关注相当于AOP中的围绕建议,具有更精确的切入点语义。尽管从技术上讲,关注点"包装"潜在的关注点/混合是正确的,但我宁愿不将其视为"包装器"而是"拦截器"。处理的是传入呼叫。概念上略有不同,可能并不适合所有人。
关注点(无状态)和 Mixins(有状态)也有可能只在它们覆盖的接口中实现方法的子集,只需使类"抽象"即可。Qi4j 将填充缺失(和未使用)的方法调用。并且可以使用任何组合。
此外,实施良好的问题应该称为"下一个",因为它们应该不知道它们的实际用途。如果关注点需要处理方法调用。每个复合类型方法都必须有一个 Mixin,否则组装将失败。
简而言之; 1. 一个 Mixin 实现可以实现零个(又名私有混音),一个或多个复合类型接口的方法。 2. 关注点可以实现复合类型接口的一个或多个方法。
同样有趣的是,当一个类(mixin 或关注点)调用复合类型接口中自己的方法之一时,调用将不是类内调用,而是从外部调用复合,因此调用整个调用堆栈,以确保内部调用和外部调用在结果上相同。如果需要绕过模式,则存在模式。