2010-02-20 41 views
14

我今天正在做一些代碼審查,遇到了一些開發人員編寫的舊代碼。它是這樣的內部抽象方法。爲什麼會有人擁有它們?

public abstract class BaseControl 
{ 
    internal abstract void DoSomething(); 
} 

如果你有相同的組件內的派生類,它的工作

public class DerivedControl : BaseControl 
{ 
    internal override void DoSomething() 
    { 
    } 
} 

但是在不同的程序集派生的基類將使編譯時錯誤

DerivedControl does not implement inherited abstract member 'BaseControl.DoSomething() 

這讓我想到了。爲什麼有人將一種方法聲明爲內部抽象?

回答

12

原始程序員想要將派生控件提供給客戶端代碼。但是要防止客戶繼承和混淆虛擬方法。這並不是一個壞主意,通過重寫一個方法並執行一些類似於忘記調用基類方法的方法來打破基類通常很容易。

+0

直到你第四次在第三方庫中遇到這種居高臨下的假設時,這可能不是一個壞主意。它通常意味着大量不必要的重複。 (DevExpress,我看着你......) – jnm2 2014-07-16 17:29:05

1

我最初的反應是,沒有很好的理由,如果你想防止外部繼承,那麼你應該標記類內部。但這意味着這個類對其他程序集是完全隱藏的。

我想這種方法可以防止外部繼承,同時保留可見性。

+1

否 - 如果要防止外部繼承,則使構造函數成爲內部函數。你不需要讓整個班級都是內部的。 – RobSiklos 2013-06-07 18:02:29

+0

使內部類和內部構造函數有什麼區別? – RSB 2015-01-16 13:25:58

+0

@RobSiklos在什麼情況下,應該讓課程內部生成 – RSB 2015-01-19 05:33:35

6

一個明顯的例子是該方法接收或返回一個內部類型。例如,WPF Transform類的核心方法處理一些內部的互操作類型,WPF不公開其公共API的一部分。由於簽名包含內部類型,因此該方法不能公開或受保護。然而,很顯然,各種變換類以多態方式工作是適當的(必要!)。因此Transform/GeneralTransform中的基本方法必須是內部的。

另一個但相關的原因是爲了防止外部推導。畢竟,WPF架構師可以在受保護的抽象方法中公開內部互操作類型的「安全」版本,以便用戶可以創建自己的Transform類。他們並不是因爲他們不想應對人們使用該能力的方式,例如,創建非仿射變換。允許外部派生會使WPF中其他類的工作變得更加複雜,所以架構師決定只通過內部抽象方法來允許「批准」派生類。

0

通過將方法定義爲內部抽象,您希望確保只有同一個程序集中的類可以爲您的方法實施它。

現在,如果你發佈了一個dll,這將避免客戶端繼承和實現實現。

相關問題