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

Mar*_*eIV 3 c# constructor subclass objective-c static-members

好的......在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");
Run Code Online (Sandbox Code Playgroud)

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

所以...任何接受者?

Ste*_*tti 6

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

public class MyBaseClass
{
    public string Name { get; private set; }

    public static T GimmeOne<T>(string name) where T : MyBaseClass, new()
    {
        return new T() { Name = name };
    }

    protected MyBaseClass()
    {
    }

    protected MyBaseClass(string name)
    {
        this.Name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var foo = SubClass1.GimmeOne<SubClass1>("I am Foo");
Run Code Online (Sandbox Code Playgroud)