2015-10-24 32 views
1

我知道標題有點長,所以這是我的問題。 我有這個類,例如:如何確保類的新實例只能由其他類創建?

public class Connection 
{ 
    public static Connection Create() 
    { 
      return new Connection(); 
    }    
} 

我需要確保連接的新的實例只能通過其他類來創建,調用創建method.The解決方案必須允許類從連接繼承。

我發現的一些答案是使類abstractstatic但我記得,你不能讓抽象或靜態類的實例,也不能從靜態繼承。

另外兩個提供的答案是使Connection類的構造函數privateprotected。好的,如果構造函數設置爲private,我們不能從派生類調用他,但如果它被保護,我們可以。

所以,我的想法是讓構造函數protected。我是正確的嗎?因爲我發現有人發佈使Connection類爲static是正確的答案,並且這沒有任何意義。

+0

你不能。一個類可以始終在其內部實例化。 –

回答

2

staticabstract都出於您在問題中列出的原因。讓其他類繼承你的方法,同時禁止直接實例化的方法是使構造函數protected。但請記住,繼承類可以選擇允許自己的構造函數爲public,從而規避您的保護。

一般來說,一個類應該被設計爲繼承或實例化,但不能同時用於兩個目的。更好的設計是如下:

public abstract class Connection { 
    protected Connection(); 
    public static Connection Create() { 
     return new DefaultConnection(); 
    } 
} 
internal sealed class DefaultConnection : Connection { 
    public DefaultConnection() { 
     ... 
    } 
} 

從外部類可以繼承Connection,但因爲它是abstract他們不能實例化。另一方面,您的代碼可以創建DefaultConnection的實例,因爲它是internal,所以對其他人隱藏。

0

如果您在主類中將其創建爲子類,請將構造函數設置爲在主類中內部生成並使用主類中的私有方法驗證的參數。

這種方式沒有外部類不能實例化子類沒有拋出異常。

相關問題