2011-02-14 37 views
0

如何模擬靜態方法的繼承?TryParse static但繼承了

我有幾個派生類,我希望他們每個人都有一個靜態的「TryParse」方法。

+0

爲什麼該方法需要靜態? –

+0

輸入類型不會有差別,還是每個人都希望只使用上升的成員解析同樣好? –

+0

爲什麼該方法需要*繼承*?每個類都有一個靜態方法。 – Timwi

回答

0

靜態方法不能是虛擬的。

1

有沒有辦法做靜態方法的繼承。繼承只存在於實例級別的成員,而不是級別級別的成員。 This answer擴展了這個主題。

+0

我完全理解,但是模擬這個的好模式是什麼? –

+1

@John:在每個類上聲明一個單獨的靜態方法。 – Timwi

0

你不行。

什麼,那還不夠好?

有幾種不同的方式來解決這個限制,但都不是很好。

首先,使用標準接口定義來要求實例上的TryParse方法。爲了使用這個,當然,你必須有一個實例。一個例子是IActivityTemplateFactory的Create方法。該方法不需要是實例,實際上你會發現大多數工廠都是靜態的(不管這是不是好事還是另一個問題)。但爲了能夠1)找到一個活動的工廠,並2)調用該方法3)可以被子類型覆蓋,它必須在界面中定義。

二是使用屬性。一個例子是TypeConverterAttribute。你可能能夠利用這種類型來做你想做的事,或者你可以創建一些類似的東西,它們會有你的TryParse方法。

+0

好的想法與屬性! –

0

AFAIK你不能繼承靜態方法的繼承。但是你可以做的是,你可以聲明一個實例方法(可能有一個「受保護」的訪問修飾符),將執行實際的解析和重寫方法代替:

public abstract class MyBaseClass 
{ 
    protected virtual bool TryParseInner(string s) { ... } 
} 

現在你的靜態方法如下所示:

public static bool TryParse<T>(string s, out T result) where T: MyBaseClass, new() 
{ 
    bool ret = false; 

    result = new T(); 
    ret = result.TryParseInner(s); 

    if (!ret) result = null; 

    return ret; 
} 

這種方法的不好的一面是TryParse方法,迫使子類有一個參數的構造函數聲明的泛型類型約束。

希望這會幫助你。