2009-08-16 46 views
2

我會繼承一個特定的對象是動態的,並通過app.config文件等某種類型的額外設置進行設置。你可以在C#中繼承動態嗎?

下面是一個例子:

//PROGRAM A 
public class MySuperClass : OldIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 


//PROGRAM B 
public class MySuperClass : OldIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 

//PROGRAM B .....a Few Years Later..... 
public class MySuperClass : NewIneritanceObjectVersion 
{ 
     ........Stuff Goes Here 
} 

正如您可以猜到,我希望我的舊的東西使用OldIneritanceObjectVersion而我想新的東西,我創建以及更新舊的東西用更多更新的NewIneritanceObjectVersion保持。有沒有辦法動態地做到這一點?

回答

5

編號C#是靜態類型的。編譯時必須知道每個類的類型層次結構。

2

您可能會通過T4做到這一點。您可以爲您的班級設置模板,並輕鬆更改此行爲。

雖然這成爲編譯時構造,而不是運行時構造。在運行時無法做到這一點(很容易),每次運行時都不會動態生成類型,並且在內存彙編中有某種類型。


另一個想到這裏 -

你可以達到相同的效果,或通過使用控制和依賴注入的反轉朝着這個目標努力。讓你的類依賴於基類或者一個接口。這將使得以後,在運行時,通過配置或許多其他技術更改實現變得非常容易。

1

您可以將您的「基類」導出到單獨的DLL中,並在您的項目中引用它。然後,當您擁有該DLL的新版本時,只需替換舊版本即可。

但是通過這樣做,您將不得不保持基類的相同名稱,並且它將被無處不在地替換爲新版本。我想這應該不是問題。

0

你可以嘗試像這樣......不要改變OldInheritanceObjectVersion的子類的所有地方的inhertiance結構。相反,在一個地方更改OldInhertianceObjectVersion的inhertance結構!

//NewInheritanceObjectVersion 
public class NewInheritanceObjectVersion 
{ /* 
     ...Move original stuff from OldInheritanceObjectVersion to this class here 
     ...with any new stuff/changes here. Should probably maintain backwards 
     ...compatibility with OldInheritanceObjectVersion if we can 
     ...(or OldInhertianceObjectVersion can be an adapter that maintains backwards 
     ... compatibility and adapts/delegates to this class) 
    */ 
} 

//OldInheritanceObjectVersion 
public class OldInheritanceObjectVersion : NewInheritanceObjectVersion 
{ /* 
     ...Since old and new stuff is implemented in NewInheritanceObjectVersion 
     ...this is simply a "pass-through" class so that all classes that inherit 
     ...from this class get old and new behavior without changing their inheritance 

     ...worst case, this class can expose the old interface/class definition and 
     ...delegate/adapt the methods/properties to the new 
     ...features in NewInheritanceObjectVersion 
     ...if NewInheritanceObjectVersion does not implement them directly 
    */ 
} 

//PROGRAM B .....a Few Years Later..... 
public class MySuperClass : OldInheritanceObjectVersion 
{ /* 
     ........Without changing this at all, we get all old behavior 
     ........and we can update it to take advantage of new features as well 
    */ 
} 
+0

是什麼這一點,簡單地改變OldInheritanceObjectVersion之間的區別? – 2009-08-17 00:47:00

+0

其實不是一個壞點。當我重新審視這個問題時,它似乎沒有什麼意義,最好的答案真的可以說明一切。 – 2009-08-17 03:06:26

0

你基本上正在改變繼承鏈以取決於新的具體實現。這很臭,雖然它可能通過某種代碼發射 - 我從來沒有嘗試過,並且傾向於同意約翰S--我強烈建議不要這樣做。

如果您擔心需要向繼承鏈注入新項目,我會在「OldInheritenceObjectVersion」中進行一些封裝,並通過依賴注入將實際實現注入到它中。

我對此仍然感到不舒服,但如果你決定通過繼承來做到這一點,那麼它可能是阻力最小的路徑。

0

我知道這個線程是相當古老的,但也許這個答案將有助於未來的人。

是的,這是可能的。今天不僅僅是動態的繼承,但是即使是多重繼承也是可能的(甚至兩者同時)。你曾經聽說過mixin嗎?

一個解決方案,您的問題可能是re-motion,一個開源開發框架(它提供了很多強大的功能,就像使用用C#混入):