2012-11-26 102 views
5

可能重複:
How can I force inheriting classes to implement a static method in C#?如何強制抽象類childs實現靜態方法?

我理解抽象的,靜態的是相反的,但我想迫使派生類實現的靜態方法。我怎樣才能做到這一點?

在SimonC後編輯: 在試圖描述我想要做什麼時,我意識到超類的靜態方法將無法調用重寫的子類版本。

但奧利維爾的替代解決方案看起來不錯。

+2

總之,你可以」噸。你爲什麼想這樣做? – SimonC

+0

這裏的一個用例是一個靜態的「CreateDefault」方法,它返回父類的對象,但每個子類都會覆蓋它。現在我知道它並沒有什麼意義,因爲爲了使用它,您仍然需要使用子類的靜態上下文來調用CreateDefault,這違背了使用繼承的目的。在我看來,這裏尋找的真正優點是編譯器時間檢查子類實現靜態方法。 – matrixugly

+0

再說一遍,這並沒有多大的幫助,因爲它並沒有強制你的靜態方法在任何地方被使用。我認爲Olivier的答案中的單身主意真的是最好的。我同意@SimonC的觀點,即開發者應該退後一步,通過嘗試在父類中使用靜態方法並在子類中重寫,找出他們真正想要實現的目標。 – matrixugly

回答

14

將靜態行爲與繼承或接口實現相結合的一種可能方法是使用單例模式。一個單對象的訪問是靜態的,但對象與new像一個「正常」的創建對象

public interface ISomeInterface { ... } 

public class SomeClass : ISomeInterface 
{ 
    public static readonly SomeClass Instance = new SomeClass(); 

    private SomeClass() 
    { 
    } 

    // Implement ISomeInterface 
    // or override an abstract member from a base class (not shown here). 
} 

訪問單的方法

ISomeInterface obj = SomeClass.Instance; // Static access to interface. 
var y = obj.SomeMethod(x); 
+1

對於更復雜的方案,您可以查看工廠方法/類設計模式,以及可能的懶惰實例。 –

4

你不能。靜態方法不受多態行爲的影響。你甚至不能自發地重寫靜態方法,更不用說強制一個類來覆蓋它們。

3

對不起,但這是不可能的。抽象和/或基類都是關於對象繼承的。

static方法是特定於一個且只有一個類,並且是不是可繼承。