2012-10-22 37 views
1

我有一個抽象類,應該成爲一個龐大的層次結構類的基礎。除此之外,它有一定的抽象方法。在執行過程中,這將是這個類的所有對象不斷通過只知道這個抽象類的系統調用,不是它的孩子們:其實不會覆蓋在C#中優化空方法調用

foreach(AbstractClass object in allTheObjects) 
     object.DoStuff(); 

然而,它的很多的孩子這個方法(在基類中是空的);那些使用它的人和那些沒有在類層次結構中分佈的人。 C#能否處理這種空白的方法,還是必須以某種方式優化它?

P.S .:我知道不成熟的優化是邪惡的,但它讓我真的好奇。

+0

**你是什麼意思**優化**? –

+3

如何優化一個什麼都不做的方法? – JonH

+1

*然而,它的很多孩子實際上會有這種方法是空的*忽略可能的性能考慮,這並不表示你的設計是好東西。如果你願意,你可能想在這裏贊成組合而不是繼承。 –

回答

3

我不會爲此擔心。在C#中,方法調用非常便宜。即使你會選擇這個,我懷疑你會看到任何不同之處。請參閱this以供參考。

我更擔心的是,如果你能避免通過一切循環,或什麼樣的數據strucutre allTheObjects是。我想說那裏有更多的優化潛力。你

也不妨考慮一下,如果你真的需要一個大的繼承結構,或者如果你能達到與成分或接口你的目標。

您還可以找到更多信息here(接口中的方法與委託相對於正常的方法調用)

+0

你究竟是什麼意思**在C#中,方法調用非常便宜。**?而不是在其他語言中使用昂貴的東西? –

+0

這意味着他們並不昂貴,所以你不必擔心打電話給他們(或重構一個大的兩個)。 – LueTm

+0

@BigM這意味着LueTm不能說存在的所有其他語言,他只能說C#(或者只選擇說C#),這是什麼在這裏和他有什麼經驗。 – Servy

2

然而,它的很多的孩子其實都會有這樣的方法空

也許你需要聲明這個方法是虛擬的而不是抽象的?因此你可以提供默認的空實現。

+0

這就是我的意思,我不知道爲什麼我沒有澄清。但是同樣的空方法被調用,所以它聲明的地方沒有什麼區別,對吧? –

+0

@golergka:基礎上的空虛擬方法僅僅消除了抽象方法空實現的需要。 – jwaliszko

+0

這就是我所做的,起初我沒有澄清。 –