Вставка классов в дерево наследования - PullRequest
0 голосов
/ 10 сентября 2010

Интересно, можно ли было бы вставлять классы в дерево наследования в произвольных позициях.

Пример:

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");
    }
}

Ключевые слова "до" и "после" будут определять, куда именно должен быть вставлен класс.

В прошлом я работал с системой, которая поддерживала бы что-то подобное, и это было огромным приростом производительности.

Возможно ли это принципиально с, например, .Net CLR или с Java Runtime?Можно ли изменить v_table, чтобы он указывал на новый базовый класс?Почему ни одна современная система не поддерживает это?Каковы будут последствия в отношении надежности, безопасности и так далее?

Ответы [ 3 ]

1 голос
/ 10 сентября 2010

Ребята из JRebel не могут справиться с изменениями в иерархии типов в JVM, и, поскольку это их основная компетенция, я заключаю, что это практически невозможно.сделать это можно с помощью Aspect Oriented Programming и AspectJ.

0 голосов
/ 10 сентября 2010

Этого нельзя сделать в .NET и Java. Можете ли вы сказать, какая система поддерживает это?

0 голосов
/ 10 сентября 2010

Вы ищете шаблон декоратора, когда говорите «изменение поведения»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...