Интересно, можно ли было бы вставлять классы в дерево наследования в произвольных позициях.
Пример:
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, чтобы он указывал на новый базовый класс?Почему ни одна современная система не поддерживает это?Каковы будут последствия в отношении надежности, безопасности и так далее?