在C#的继承链中调用创建静态方法类型的对象

vit*_*tch 2 c# syntax inheritance static types

我想在C#中做这样的事情

public class ParentClass {
  public static ParentClass GetSomething()
  {
    var thing = new // ?????
    return thing;
  }
}

public class ChildClass : ParentClass {
}
Run Code Online (Sandbox Code Playgroud)

然后我希望能够在子类上调用静态方法,如下所示:

ChildClass blah = ChildClass.GetSomething();
Run Code Online (Sandbox Code Playgroud)

例如,当在子类上调用静态方法时,我想实例化子类的实例.但我只想在父级上定义静态方法.这是可能吗?我很高兴,即使:

ChildClass blah = (ChildClass) ChildClass.GetSomething();
Run Code Online (Sandbox Code Playgroud)

谢谢!

jas*_*son 5

这闻起来很糟糕,但你可以这样做:

public class ParentClass {
    public static T GetSomething<T>() where T : ParentClass, new() {
        return new T();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

ParentClass parent = ParentClass.GetSomething<ParentClass>();
ChildClass child = ChildClass.GetSomething<ChildClass>();
Run Code Online (Sandbox Code Playgroud)

这也是合法的:

ParentClass parent = ChildClass.GetSomething<ParentClass>();
Run Code Online (Sandbox Code Playgroud)

这有助于这种ParentClass parent = ParentClass.GetSomething<ParentClass>()气味(是的,它只是编译,但它仍然闻到).

  • @vitch:Jon Skeet的书中有一个关于泛型的非常好的章节(如果你在C#开发中走得很远,我会高度推荐).至于"C#最佳实践",我认为Effective C#和更有效的C#(Bill Wagner)在这里以及框架设计指南(Microsoft)都很好.(Jon的书在这方面也很好,但不像上述文本那样明确.) (2认同)