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

时间:2010-09-09 03:48:11

标签: c# objective-c constructor subclass static-members

Ok ...在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#也能做到。

所以...任何接受者?

2 个答案:

答案 0 :(得分: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;
    }
}

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

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

答案 1 :(得分:0)

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

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