假设您有一个抽象基类:
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)
的构造函数似乎是合理的。
答案 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的大量最佳实践。也许你最好创建一个工厂类来创建你的对象?