回答
靜態方法不能是虛擬的。
有沒有辦法做靜態方法的繼承。繼承只存在於實例級別的成員,而不是級別級別的成員。 This answer擴展了這個主題。
我完全理解,但是模擬這個的好模式是什麼? –
@John:在每個類上聲明一個單獨的靜態方法。 – Timwi
你不行。
什麼,那還不夠好?
有幾種不同的方式來解決這個限制,但都不是很好。
首先,使用標準接口定義來要求實例上的TryParse方法。爲了使用這個,當然,你必須有一個實例。一個例子是IActivityTemplateFactory的Create方法。該方法不需要是實例,實際上你會發現大多數工廠都是靜態的(不管這是不是好事還是另一個問題)。但爲了能夠1)找到一個活動的工廠,並2)調用該方法3)可以被子類型覆蓋,它必須在界面中定義。
二是使用屬性。一個例子是TypeConverterAttribute。你可能能夠利用這種類型來做你想做的事,或者你可以創建一些類似的東西,它們會有你的TryParse方法。
好的想法與屬性! –
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
方法,迫使子類有一個參數的構造函數聲明的泛型類型約束。
希望這會幫助你。
- 1. 瞭解繼承
- 2. 爲了繼承
- 3. 瞭解繼承
- 4. UML - 類繼承,你繼承了什麼?
- 5. 繼承了在Lua
- 6. 瞭解PHP繼承
- 7. 瞭解Java繼承
- 8. python類繼承瞭解
- 9. 在C++中瞭解繼承
- 10. 更改繼承了高度
- 11. 試圖瞭解繼承鏈
- 12. 繼承了QIODevice的QAudioDecoder
- 13. 瞭解Javascript原型繼承
- 14. 組成了私有繼承
- 15. 我誤用了繼承嗎?
- 16. 繼承了jQuery的div
- 17. Convert.ToInt32與TryParse
- 18. 瞭解javascript繼承和node.js util繼承函數示例
- 19. 模板類中的'Static'模板類 - 封裝,繼承或...?
- 20. 繼承自std :: true_type vs static constexpr const布爾成員
- 21. 哪些語言「有繼承但沒有繼承」?
- 22. maven父pom依賴繼承版本,但不繼承排除
- 23. 爲什麼.aspx繼承了IDispose,但.ashx不是?
- 24. 泛型類繼承了通用接口,但是在編譯
- 25. 繼承的繼承集合
- 26. 繼承Python類繼承docstrings
- 27. 繼承的繼承函數
- 28. Java繼承與C#繼承
- 29. 虛擬繼承,一類足夠了嗎?
- 30. ReadonlyArray在TypeScript中繼承了哪些類?
爲什麼該方法需要靜態? –
輸入類型不會有差別,還是每個人都希望只使用上升的成員解析同樣好? –
爲什麼該方法需要*繼承*?每個類都有一個靜態方法。 – Timwi