3

好的......在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# 也是如此。

所以……有接盘侠吗?

4

2 回答 2

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");
于 2010-09-09T04:03:30.687 回答
0

对不起,你不能这样做。C# 在道德上反对静态方法继承。GimmeOne 方法永远不会有除 MyBaseClass 之外的任何类型,从 SubClass1 调用它并不重要——它仍然是“真正的”MyBaseClass 调用。反射库可以进行这种构造,但除了 MyBaseClass 之外,您永远不会得到任何东西。

如果您正在调用静态方法,大概您知道从哪个子类调用它。为每个子类创建不同的工厂方法。如果您实际上是在尝试通过实例执行此操作,则可能应该使用非静态虚拟工厂方法(它将自动调用函数的最派生形式,这可能是您想要的)。

于 2010-09-09T04:00:03.800 回答