我想知道是否可以在继承树中的任意位置插入类。
示例:
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”将控制插入类的确切位置。
在过去,我使用的系统支持这样的东西,这是一个巨大的生产力提升。
例如,使用Java或.Net运行时,这在原则上是可能的吗?是否可以将v_table更改为指向新的基类?为什么没有现代系统支持这一点?在可靠性、安全性等方面的影响是什么?
发布于 2010-09-10 19:06:54
来自JRebel的家伙无法处理JVM上类型层次结构的变化,因为这是他们的核心能力,我得出结论,这几乎是不可能的。
然而,我认为您想要做的大多数事情都可以使用面向方面编程和AspectJ来完成。
发布于 2010-09-10 19:09:06
当你说“修改行为”时,你是在寻找装饰器模式吗?
发布于 2010-09-10 22:30:53
这在.NET和Java中是做不到的。你能说出哪个系统支持它吗?
https://stackoverflow.com/questions/3684041
复制相似问题