【发布时间】:2010-09-10 11:00:14
【问题描述】:
我想知道是否可以在继承树中的任意位置插入类。
例子:
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 运行时实现吗?是否可以将 v_table 更改为指向新的基类?为什么没有现代系统支持这一点?对可靠性、安全性等有何影响?
【问题讨论】:
-
我也在考虑这个问题。但是对于代码的质量和稳定性来说,这将是一场噩梦。您将无法控制课程的使用方式。如果我查看我正在处理的项目中的代码,我很感激,如果所有程序员都理解并以正确的方式使用“正常”的面向对象编程模型。您可能会像他的回答中提到的那样研究 AOP。
标签: c# java oop inheritance