inversionhourglass / Rougamo

Compile-time AOP component. Works with any method, whether it is async or sync, instance or static. Uses an aspectj-like pattern to match methods.
MIT License
393 stars 47 forks source link

类继承下的切面动作 #5

Closed dboydboy closed 2 years ago

dboydboy commented 2 years ago

试了一下继承下的切面动作:

  1. 父类 企业微信截图_16511390962885
  2. 子类 企业微信截图_16511391406328
  3. 创建子类并调用重载方法后的结果 企业微信截图_1651139218470

觉得结果和预想的不太一样... 是否可以:

  1. 子类重写方法的切面标签可以覆盖父类 或者
  2. 父类的前面标签可以把子类也包进去...
inversionhourglass commented 2 years ago

Attribute的继承很容易导致混乱,不同于方法,你override一下就知道哪些方法可以重写,Attribute如果支持了继承,那么你在编写代码的时候如果想知道你的这个方法应用了哪些Attribute,你就必须手动一层一层的往上找,想要覆盖那个也要一层一层的找,如果父类什么时候去掉了某个Attribute,子类并不会编译报错不会收到任何提示。总而言之,支持Attribute继承/重写等操作都不是一个好的方式,该功能不予支持。

另外代码和输出结果最好以代码和文字直接插入,而不要使用截图

dboydboy commented 2 years ago

Attribute的继承很容易导致混乱,不同于方法,你override一下就知道哪些方法可以重写,Attribute如果支持了继承,那么你在编写代码的时候如果想知道你的这个方法应用了哪些Attribute,你就必须手动一层一层的往上找,想要覆盖那个也要一层一层的找,如果父类什么时候去掉了某个Attribute,子类并不会编译报错不会收到任何提示。总而言之,支持Attribute继承/重写等操作都不是一个好的方式,该功能不予支持。

另外代码和输出结果最好以代码和文字直接插入,而不要使用截图

静态织入下确实不太好实现... 能否实现子类中的切面执行,祖先的切面都不执行?类似优先级...

inversionhourglass commented 2 years ago

Rougamo本身来考虑是做不到的,比如下面有AB两个类,按你的想法Main方法中调用a.Print的时候[Test2("Parent")]生效,调用b.Print的时候是[Test2("Sub")]生效而[Test2("Parent")]是不生效的。在静态织入里,只有选择织入和不织入,而不能根据运行时的调用来决定

class A
{
  [Test2("Parent")]
  public virtual void Print(string message)
  {
    Console.WriteLine(message);
  }
}

class B : A
{
  [Test2("Sub")]
  public override void Print(string message)
  {
    message = $"[{DateTime.Now}] {message}";
    base.Print(message);
  }
}

static void Main()
{
  var a = new A();
  var b = new B();
  var msg = "message";
  a.Print(msg);
  b.Print(msg);
}