我想知道是否可以在任意位置的继承树中插入类。
示例:
class Base
{
public virtual void DoSomething()
{
Console.WriteLine("Base");
}
}
class D1:Base
{
public override void DoSomething()
{
base.DoSomething();
Console.WriteLine("D1");
}
}
class D2:Base
{
public override void DoSomething()
{
base.DoSomething();
Console.WriteLine("D2");
}
}
class D3:Base
{
public override void DoSomething()
{
base.DoSomething();
Console.WriteLine("D3");
}
}
想象一下,上面的类来自没有可用源代码的库。如果我想修改所有派生类的行为,我必须从所有派生类继承并多次实现相同的东西。然后我必须将所有类型更改为我新派生的类型。一种更简单的方法是在Base之后直接插入一个类,并以某种方式(可能是一个大的某种方式)使派生类指向它作为它们的基础对象。然后可以不加改变地使用派生类。
class Inserted : after Base
{
public override void DoSomething()
{
base.DoSomething();
Console.WriteLine("Inserted");
}
}
或
class Inserted : before D1
{
public override void DoSomething()
{
base.DoSomething();
Console.WriteLine("Inserted");
}
}
关键字“before”和“after”将控制插入类的确切位置。
在过去,我使用的系统可以支持这样的事情,这是一个巨大的生产力提升。
例如,.Net CLR还是Java Runtime,这主要是可行的吗?是否可以将v_table更改为指向新的基类?为什么没有现代系统支持这个?关于可靠性,安全性等的影响会是什么?
答案 0 :(得分:1)
来自JRebel的人员无法处理JVM上类型层次结构的变化,因为这是他们的核心竞争力,我认为这几乎是不可能的。
但是我认为你想做的大多数事情都可以使用面向方面编程和AspectJ来完成。
答案 1 :(得分:0)
当您说“修改行为”时,您是否在寻找装饰器模式?
答案 2 :(得分:0)
这不能在.NET和Java中完成。 你能告诉那个系统支持什么吗?