2011-03-06 33 views
0

聚合優先於繼承。繼承可以知道父類。在聚集中,如何才能知道C#中的所有者?如何獲得一個班級的「所有者」(不是父級),當它被聚合爲另一個班級的成員時

如果我添加一個明確的引用,這是邪惡的父母,因爲我會以另一種方式創建一個依賴關係,而編譯器肯定知道父對象。除了創建這個引用之外,還有什麼方法可以使用反射或其他的東西來破解。

如果所有者未知,Visual Studio如何構建調用堆棧? Visual Studio知道連接實例的所有鏈接,因此應該有辦法做Visual Studio的工作?

+0

編譯器不知道父級,運行時也沒有。 – SLaks 2011-03-06 19:39:25

+0

確實它確實知道,因爲孩子被連線爲父母的成員。 – user310291 2011-03-06 19:41:36

+0

你錯了。 .Net不會那樣工作。如果你把同一個孩子放在兩個父母身上呢? – SLaks 2011-03-06 19:46:10

回答

1

類沒有辦法知道其他類(或類)正在使用它,而不是直接使用它。

任何類別可能被許多其他人使用(總計) - 您如何確定哪些是所有者?

一般來說,這樣的信息也不是真的有用(你最終會得到緊密耦合的代碼,在所有者類型中全部包含switch語句),所以沒有通用的機制來獲取它。

+0

哦,這對我來說非常難過:(:)任何希望都沒有確定? – user310291 2011-03-06 19:35:04

+1

@ user310291 - 你想達到什麼目的?可能有設計解決方案,但沒有實際的問題描述,不能提供。 – Oded 2011-03-06 19:36:10

+0

什麼都沒有具體我只是在想,正如我所說如果我想通過聚合來代替繼承,那麼我需要用owner屬性替換父屬性。 – user310291 2011-03-06 19:39:51

2

除非您將所有者的引用作爲聚集類的成員添加,否則不能。

6

你不能,沒有添加代碼。哎呀,一個實例可以被「包含」幾個不同的對象中:

IAuthenticator authenticator = new PasswordAuthenticator(); 
Foo foo = new Foo(authenticator); 
Bar bar = new Bar(authenticator); 

假設都foobar記得認證,其中哪些是單一PasswordAuthenticator實例的「主人」?

更重要的是,爲什麼你需要知道?如果您確定「子」對象知道關係的確有一個很好的設計原因,請爲其添加適當的代碼(可能是一個事件,如果根據您的需要明智的話)。但首先確定它是非常必要的。

+0

正如我所說,如果我想通過聚合取代繼承,那麼我需要用owner屬性替換父屬性。 – user310291 2011-03-06 19:39:14

+0

@ user310291:你聲稱你需要,但沒有解釋*爲什麼*你需要。你在「主人」身上想得到什麼?如果不考慮整體設計,使用組合而不是繼承,通常不是一個從一個切換到另一個的情況。 – 2011-03-06 19:41:22

+0

我需要出於同樣的原因,在繼承中,有時需要父屬性,因爲我告訴過你,我正在考慮用集合代替繼承,並且我意識到我可能會遇到像這樣的麻煩。 – user310291 2011-03-06 19:44:26

相關問題