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

标签 c# objective-c constructor subclass 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");

是的,我知道我可以(而且通常会)直接使用构造函数,但我们有特定需要调用基类上的共享成员,所以这就是我问的原因。同样,Objective C 让我来做这个。希望 C# 也是如此。

那么……有人要吗?

最佳答案

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() 约束表示有一个无参数构造函数——您没有,但我们将其设为私有(private)以向消费者隐藏它。然后它可以像这样被调用:

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

关于c# - 从静态基类方法调用子类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3673636/

相关文章:

c# - c#中每个元素的两个数组比较的最小值

c# - 使用动态变量作为方法参数会禁用(某些)编译器检查

c# - 二叉树层序概念中的垂直序遍历

c# - 从 Azure Function 读取设置

ios - 使用 mediaplayercontroller 播放视频

objective-c - 如何解决KERN_PROTECTION_FAILURE和KERN_INVALID_ADDRESS?

ios - Xcode5 自动释放池错误

c++ - 默认构造函数错误 (C++)

javascript - ExtJS addEvents - 它是可选的吗?

c++ - const 成员未显式初始化但编译