从基类调用子类的构造函数

时间:2012-11-27 18:00:38

标签: c# oop constructor

假设您有一个抽象基类:

abstract class abstractBaseClass {
    public abstractBaseClass(object argument);

    public abstractBaseClass instanceMethod() {
         //call the constructor of the concrete class here.
    }
}

你有一个基类:

class baseClass {
    public baseClass(object argument) : abstractBaseClass(object argument)
}

如果在abstractBaseClass上有一个实例方法,有没有办法在实例方法中调用该具体类的构造函数而不诉诸反射?

假设在任何给定的具体基类上至少有一个带有签名concreteBaseClass(object)的构造函数似乎是合理的。

2 个答案:

答案 0 :(得分:3)

  

如果你在abstractBaseClass上有一个实例方法,那就有办法了   调用该具体类的构造函数

实际上,你已经这样做了。 Abstract类如果没有它的派生,则无法初始化。

abstractBaseClass  abs  = new baseClass();

此处的真实对象类型为baseClass,因此会按惯例调用ctor

编辑

if 你的意思是构造*一个新的*真实对象,它被托管在抽象引用中(Sevy在评论中提到的东西),我建议,在这一点上,只是使用 覆盖模式。像这样:

abstract class abstractBaseClass {
    public abstract abstractBaseClass(object argument);
    public abstract abstractBaseClass CreateMe();
}


class baseClass : abstractBaseClass
{
   ...
   public override abstractBaseClass CreateMe(){
      return new baseClass();
   }
}

使用后就像

一样
abstractBaseClass  newAbs = abs.CreateMe();

这样的东西,只是一个想法。 你应该自己弄清楚适合你需要的真实,具体的实现。

答案 1 :(得分:0)

如果您的意思是“我可以在new baseClass()内拨打abstractBaseClass,然后是,您可以。

如果你的意思是“我能动态地弄清楚哪个类继承了我和新的一个”,那么不,不是没有使用反射。您无法知道是否有多个类型继承自您。

顺便说一下,这是一个非常奇怪的场景,听起来像是违反了OOP的大量最佳实践。也许你最好创建一个工厂类来创建你的对象?