【发布时间】:2014-12-24 18:44:42
【问题描述】:
我找到了两种方法来解决泛型中缺少“新(参数)”的问题,但我想知道是否有更好的解决方案来解决这种情况。
我需要在 Earth 中使用 Dna 作为 ctor 中的参数创建任何水果的方法。我有很多水果。
使用 Activator(或任何类似形式)的缺点是,如果派生类没有修正器或抽象类,则会中断。
public class Earth
{
public Earth()
{
var dna = new Dna();
var orange = GetFruit<Orange>(dna);
}
private static T GetFruit<T>(Dna dna) where T : Fruit
{
return (T)Activator.CreateInstance(typeof(T), dna);
}
}
public abstract class Fruit
{
public Fruit(Dna dna)
{
}
}
public class Orange : Fruit
{
public Orange(Dna dna)
: base(dna)
{
}
}
public class Dna
{
}
使用无参数 ctor 的缺点是强制 Dna 变为可选。 'Initialize(Dna dna)' 方法也是如此。
public class Earth
{
public Earth()
{
var dna = new Dna();
var orange = GetFruit<Orange>(dna);
}
private static T GetFruit<T>(Dna dna) where T : Fruit, new()
{
return new T() { Dna = dna };
}
}
public abstract class Fruit
{
public Dna Dna { get; set; }
}
public class Orange : Fruit
{
}
public class Dna
{
}
【问题讨论】: