2010-09-10 38 views
0

我想知道是否可以在任意位置的繼承樹中插入類。在繼承樹中插入類

實施例:

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更改爲指向新的基類?爲什麼沒有現代系統支持這個?這些後果在可靠性,安全性等方面會有什麼影響?

+0

我也在想這個。但對於代碼的質量和穩定性來說,這將是一場噩夢。你將無法控制這些類是如何使用的。如果我看看我正在開發的項目中的代碼,那麼我非常感謝,如果所有程序員都明白並以正確的方式使用「常規」面向對象的編程模型。您可能會將AOP視爲他在答案中提到的人。 – 2010-09-10 11:38:55

回答

1

來自JRebel的人無法處理JVM上類型層次結構的變化,因爲這是他們的核心能力,我認爲這幾乎是不可能的。

但是我認爲大多數你想做的事情都可以使用Aspect Oriented Programming和AspectJ來完成。

+0

+1 - AOP:沒錯。 – duffymo 2010-09-10 11:11:29

0

當你說「修改行爲」時,你正在尋找裝飾模式嗎?

+0

不,我希望能夠在繼承結構中插入類。例如System.Windows.Forms.Control是.Net中幾乎所有GUI元素的基類。現在我從Control中派生一個類「Insertee」來覆蓋OnMouseClick()方法,並希望Control的所有子類都指向「Insertee」作爲它們的基類。我可以用最小的努力處理每種類型的控件的鼠標點擊。 – user351008 2010-09-10 11:32:18

0

這不能在.NET和Java中完成。 你能說出什麼系統支持嗎?