我想知道是否可以在任意位置的繼承樹中插入類。在繼承樹中插入類
實施例:
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運行時?是否有可能將v_table更改爲指向新的基類?爲什麼沒有現代系統支持這個?這些後果在可靠性,安全性等方面會有什麼影響?
我也在想這個。但對於代碼的質量和穩定性來說,這將是一場噩夢。你將無法控制這些類是如何使用的。如果我看看我正在開發的項目中的代碼,那麼我非常感謝,如果所有程序員都明白並以正確的方式使用「常規」面向對象的編程模型。您可能會將AOP視爲他在答案中提到的人。 – 2010-09-10 11:38:55