从基类创建派生类的实例

我有我的抽象基类A

public abstract class A : ICloneable { public int Min { get; protected set; } public int Max { get; protected set; } public A(int low, int high) { this.Min = low; this.Max = high; } //... public object Clone() { return new this(this.Min, this.Max); //<-- ?? } } 

我的B级扩展了哪个:

 public class B : A { public B(int low, int high) : base(low, high) { } //... } 

由于A是抽象的,因此无法实例化,但派生类可以。 是否可以从A类创建B类的新实例?

假设类A有许多派生类,它将如何知道实例化哪一个?

好吧,我想实例化我目前A的同一个类(或类型)。

也就是说,如果我从B类调用Clone方法,我想实例化一个新的B. 如果我从C类调用Clone方法,我想实例化一个新的C。

我的方法是写一些类似于:

 return new this(this.Min, this.Max); 

但这似乎不起作用也不编译。

是否有可能在C#中实现这一目标?

如果不是,是否有解释所以我能理解?

虽然我喜欢Jamiec解决方案,但我错过了使用reflection的脏解决方案:)

 public class A { public object Clone() { var type = GetType().GetConstructor(new[] { typeof(int), typeof(int) }); return type.Invoke(new object[] { this.Min, this.Max }); } } 

是的,这可以通过基类上的抽象工厂方法实现

 public abstract class A { public int Min { get; protected set; } public int Max { get; protected set; } public A(int low, int high) { this.Min = low; this.Max = high; } protected abstract A CreateInstance(int low, int high); public object Clone() { return this.CreateInstance(this.Min,this.Max); } } public class B:A { public B(int low, int high) : base(low,high) { } protected override A CreateInstance(int low, int high) { return new B(low,high); } } 

这可以完成,您当前的方法是一个定义良好的设计模式,但大多数实现使Clone成为一个抽象的虚方法,并在所有子类中覆盖它。

 public abstract class A { public abstract A Clone( ); } public class B : A { public override A Clone( ) { return new B( ); } } public class C : A { public override A Clone( ) { return new C( ); } } 

由于您使用的是C#,因此可以使用Activator类。 您可以使用默认实现将Clone方法设为虚拟(不是=== abstract)。

 public abstract class A { public virtual A Clone( ) { // assuming your derived class contain a default constructor. return (A)Activator.CreateInstance(this.GetType( )); } } 

编辑 –如果在所有派生类中没有默认的无参数构造函数,则可以向Activator.CreateInstance方法添加参数

 (A)Activator.CreateInstance(this.GetType( ), this.Min, this.Max); 

对于派生类型的不同构造函数,我建议您专门为这些类型重写Clone方法,而不是使用Clone的默认实现。