[英]Is there an alternative to Inheritable static generic classes in C#?
我想有一系列靜態類,每個類都包含一個字典,並在字典上執行兩個方法。 除了一個方法中的參數類型和另一個方法中的返回類型之外,這些方法在類的所有版本中都是相同的。
理想情況下,我想將行為(方法)放在“基礎”泛型靜態類中,然后創建幾個類型化的靜態后代,每個后代都包含自己的靜態字典。 顯然,我不能這樣做,因為一個靜態類不能從另一個靜態類繼承。
我想知道是否有其他方法可以實現我的目標。 我知道我可以使用非靜態類來完成這項工作,但在我看來,這更適合作為靜態任務。
這是我想要的草圖:
public static class BaseClass<T>
{
private static Dictionary<string, T> PrivateDict {get; set;}
private static String ToString(T argument)
{
return Somestring;
}
private static T FromString(string argument)
{
return Some-T-thing;
}
}
// This static class supplies the static dictionary but gets the static methods of BaseClass.
// Other static classes might exit that use, for instance, Dictionary<string, XElement>
public static class GenderClass : BaseClass<int>
{
private static Dictionary<string, int> PrivateDict = new Dictionary<string, int>
{
{"Male", 1},
{"Boy", 1},
{"M", 1},
{"Female", 2},
{"Girl", 2},
{"F", 2}
}
}
我建議使用類型作為“繼承”的路徑。 我在引號中說,因為它實際上只是一個旁路,但它仍然應該以你想要的類似方式工作。
我在LinqPad中測試了它,它產生了正確的結果,沒有拋出異常。 請注意,這些字段是為了測試目的而公開的。
首先,設置一個可用於傳遞字典的界面。
public interface IPublicDictionary<T>
{
Dictionary<string, T> PublicDictionary { get; }
}
接下來,設置您的類(非靜態),它將實現該接口並公開一個唯一的字典
public class GenderClass : IPublicDictionary<int>
{
public static Dictionary<string, int> PublicDict = new Dictionary<string, int>
{
{"Male", 1},
{"Boy", 1},
{"M", 1},
{"Female", 2},
{"Girl", 2},
{"F", 2}
};
public Dictionary<string, int> PublicDictionary
{
get { return PublicDict; }
}
}
現在,該類已准備好在靜態基類中使用,該基類已成為主要的工作場所。
public static class BaseClass
{
public static String ToString<F,T>(F argument) where T : IPublicDictionary<F>, new()
{
IPublicDictionary<F> t = new T();
return t.PublicDictionary.First(d => Comparer<F>.Equals((F)d.Value, argument)).Key;
}
public static F FromString<T,F>(string argument) where T : IPublicDictionary<F>, new()
{
IPublicDictionary<F> t = new T();
return t.PublicDictionary[argument];
}
}
一旦設置完畢,剩下的就是簡單地調用基類。 這是我試過的兩個樣本。
var s = BaseClass.FromString<GenderClass,int>("F");
Console.WriteLine(s);
var t = BaseClass.ToString<int,GenderClass>(2);
Console.WriteLine(t);
哪個輸出
2
Female
關於某些東西是否應該是靜態的決定與你將要使用它的方式有關。 如果你必須有一些靜態的東西,我個人會這樣做:
即:這樣的事情:
public interface foo
{
string ToString(someBase input);
someBase FromString(string input);
}
public static class Bar
{
public static string ToString(someBase input)
{
if (input.GetType() == typeof(Duck))
{
foo duckie = new DuckHandler();
return duckie.ToString(input);
}
else if (input.GetType() == typeof(DeadParrot)) { /* ..snip.. */ }
}
public static someBase FromString(string input, type Type) {
if (type == typeof(Duckie))
{
foo duckie = new DuckHandler(input);
return duckie;
}
else if (type == typeof(OKLumberjack)) { /* ..snip.. */ }
}
}
你可以看到它的去向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.