0

假设您有一个抽象基类:

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)假设在任何给定的具体基类上至少有一个带有签名的构造函数似乎是合理的。

4

2 回答 2

3

如果您在 abstractBaseClass 上有一个实例方法,是否有任何方法可以调用该具体类的构造函数

实际上,您已经这样做了。Abstract如果不是由它的派生类,则无法初始化类。

abstractBaseClass  abs  = new baseClass();

这里真正的对象类型是baseClass,所以按照ctor惯例会调用它的 。

编辑

如果您的意思是构造 * 一个新的 * 真实对象,该对象托管在抽象引用中(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();

像这样的东西,只是一个想法。您应该自己找出适合您需求的真实、具体的实现。

于 2012-11-27T18:03:42.820 回答
0

如果你的意思是,“我可以new baseClass()在里面打电话abstractBaseClass,那么是的,你可以。

如果您的意思是“我可以动态地找出从我那里继承的类和新的类”,那么不,不是不使用反射。您无法知道是否有多个类型从您那里继承。

This is, by the way, a pretty weird scenario and sounds like it violates a whole lot of best practices for OOP. Perhaps you would be better off creating a factory class to create your objects?

于 2012-11-27T18:10:49.600 回答