簡體   English   中英

C#中是否有可繼承靜態泛型類的替代方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM