从静态基类方法调用子类构造函数

好的……在Objective C中,您可以使用’new this()’从基类中的静态方法创建子类,因为在静态方法中,’this’指的是类,而不是实例。 当我第一次发现它并且我经常使用它时,这是一个非常酷的发现。

但是,在C#中不起作用。 该死的!

那么……任何人都知道如何在静态基类方法中“新建”子类?

这样的东西……

public class MyBaseClass{ string name; public static Object GimmeOne(string name){ // What would I replace 'this' with in C#? return new this(name); } public MyBaseClass(string name){ this.name = name; } } // No need to write redundant constructors public class SubClass1 : MyBaseClass{ } public class SubClass2 : MyBaseClass{ } public class SubClass3 : MyBaseClass{ } SubClass1 foo = SubClass1.GimmeOne("I am Foo"); 

是的,我知道我可以(并且通常会)直接使用构造函数,但我们需要在基类上调用共享成员,这就是我要问的原因。 再一次,Objective C让我这样做。 希望C#也这样做。

所以…任何接受者?

C#与此没有任何确切的等价物。 但是,您可以通过使用这样的generics类型约束来解决这个问题:

 public class MyBaseClass { public string Name { get; private set; } public static T GimmeOne(string name) where T : MyBaseClass, new() { return new T() { Name = name }; } protected MyBaseClass() { } protected MyBaseClass(string name) { this.Name = name; } } 

new()约束说有一个无参数的构造函数 – 你没有这个构造函数,但是我们将它私有化以隐藏消费者。 然后它可以像这样调用:

 var foo = SubClass1.GimmeOne("I am Foo"); 

对不起,你不能这样做。 C#在道德上与静态方法inheritance相对立。 GimmeOne方法永远不会有MyBaseClass以外的任何类型,并且从SubClass1调用它并不重要 – 它仍然“真的”是MyBaseClass调用。 Reflection库可以做这个构造,但是除了MyBaseClass之外你永远不会得到任何东西。

如果你正在调用静态方法,可能你知道从哪个子类调用它。 为每个子类创建不同的工厂方法。 如果你真的试图通过实例来做这件事,你应该使用非静态虚拟工厂方法(它将自动调用函数的最派生forms,这可能是你想要的)。