从基类创建派生类的实例
本文关键字:实例 派生 基类 创建 | 更新日期: 2023-09-27 18:16:36
我有我的抽象基类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# 中有可能实现这一点吗?
如果不是,有没有解释让我明白?
是的,这可以通过在基类
上使用抽象工厂方法实现。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);
}
}
虽然我喜欢Jamiec解决方案,但我错过了使用反射的脏解决方案:)
public class A {
public object Clone() {
var type = GetType().GetConstructor(new[] { typeof(int), typeof(int) });
return type.Invoke(new object[] { this.Min, this.Max });
}
}
这是可以做到的,并且您当前的方法是一个定义良好的设计模式,尽管大多数实现使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
方法成为虚拟的(而不是===抽象的)。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
的默认实现。