【问题标题】:Insertion of classes in the inheritance tree在继承树中插入类
【发布时间】: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


【解决方案1】:

JRebel 的人无法处理 JVM 上类型层次结构的变化,因为这是他们的核心能力,我认为这几乎是不可能的。

但是我认为您想做的大多数事情都可以使用面向方面的编程和 AspectJ 来完成。

【讨论】:

    【解决方案2】:

    当您说“修改行为”时,您是否正在寻找装饰器模式?

    【讨论】:

    • 不,我希望能够在继承结构中插入类。例如 System.Windows.Forms.Control 是 .Net 中几乎所有 GUI 元素的基类。现在我从 Control 派生一个类“Insertee”,覆盖 OnMouseClick() 方法,并希望 Control 的所有子类都指向“Insertee”作为它们的基类。然后,我可以毫不费力地处理每种控件的鼠标点击。
    【解决方案3】:

    这不能在 .NET 和 Java 中完成。 你能说出什么系统支持它吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多