C#中是否有可继承静态泛型类的替代方法?

时间:2013-09-30 20:57:02

标签: c# generics inheritance static

我想有一系列静态类,每个类都包含一个字典,并在字典上执行两个方法。除了一个方法中的参数类型和另一个方法中的返回类型外,这些方法在所有类的版本中都是相同的。

理想情况下,我希望将行为(方法)放在" base"通用静态类,然后创建几个类型的静态后代,每个后代包含自己的静态字典。显然,我无法做到这一点,因为一个静态类不能从另一个静态类继承。

我想知道是否有其他方法可以实现我的目标。我知道我可以使用非静态类来完成这项工作,但在我看来,这更适合作为静态任务。

这是我想要的草图:

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}
  }
}

2 个答案:

答案 0 :(得分:3)

我建议使用type作为“继承”的路径。我在引号中说,因为它实际上只是一个旁路,但它仍然应该以你想要的方式工作。

我在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

答案 1 :(得分:0)

关于某些东西是否应该是静态的决定与你将要使用它的方式有关。如果你必须有一些静态的东西,我个人会这样做:

  • 有一个逻辑接口。然后根据需要制作尽可能多的类,每个类都专门化逻辑。如果有任何共享逻辑,也许可以创建一个非静态的基本抽象类,并根据需要再次使用多个子项。
  • 在静态类的给定方法中,根据您获得的参数选择要使用的逻辑实现类。然后实例化所选类的对象,调用相关方法,并返回其结果。
我是这样的:

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.. */ }
    }
}

你可以看到这一点。