C# 如何使返回类型成为当前类,子类将使用方法
我正在模拟一个生态系统,它非常简单,所以不用担心现实主义。 繁殖方法位于有机体类中,除返回类型为有机体外,该类植物完全可以使用繁殖方法:C# 如何使返回类型成为当前类,子类将使用方法,c#,C#,我正在模拟一个生态系统,它非常简单,所以不用担心现实主义。 繁殖方法位于有机体类中,除返回类型为有机体外,该类植物完全可以使用繁殖方法: public Organism Reproduce() { double[] copy = new double[genes.Count]; for(int i = 0; i < copy.Length; i++) // 10% chance to mutate, change up
public Organism Reproduce()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
return new Organism(genes);
}
public有机体复制()
{
double[]copy=新的double[genes.Count];
for(int i=0;i
我知道在Ruby中可以返回“self”,因此如果该方法被扩展该方法的类使用,该方法将返回继承类的对象
所以问题是:我如何修改这个方法,当从工厂调用它时,它将生成一个工厂并返回一个工厂?您将需要使用泛型。最简单的方法就是使这个方法通用。您将遇到的一个问题是必须有一个公共的无参数构造函数
public TOrganism Reproduce<TOrganism>()
where TOrganism : Organism, new()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
TOrganism child = new TOrganism();
child.Genes = genes;
return child;
}
您将需要使用泛型。最简单的方法就是使这个方法通用。您将遇到的一个问题是必须有一个公共的无参数构造函数
public TOrganism Reproduce<TOrganism>()
where TOrganism : Organism, new()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
TOrganism child = new TOrganism();
child.Genes = genes;
return child;
}
您需要在这里查看OO和设计。该方法可以返回生物体或植物都从中继承的基类,同时重写reproducte(),并将它们自己类型的实例化作为该基类返回。或者,植物可以从有机体继承并重写该方法,以将植物的实例化作为有机体返回
(注意:我不是生物学家,所以我不知道植物是否是有机体。)你需要看看这里的OO和设计。该方法可以返回生物体或植物都从中继承的基类,同时重写reproducte(),并将它们自己类型的实例化作为该基类返回。或者,植物可以从有机体继承并重写该方法,以将植物的实例化作为有机体返回
(注意:我不是生物学家,所以我不知道植物是否是生物体。)您可以使用反射,但让父类调用其子类构造函数看起来很可疑
public Organism Reproduce()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
return Activator.CreateInstance(GetType(), copy);
}
public有机体复制()
{
double[]copy=新的double[genes.Count];
for(int i=0;i
您可以使用反射,但让父类调用其子类构造函数看起来很可疑
public Organism Reproduce()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
return Activator.CreateInstance(GetType(), copy);
}
public有机体复制()
{
double[]copy=新的double[genes.Count];
for(int i=0;i
谢谢,我选择第一个选项。谢谢,我选择第一个选项。
public Organism Reproduce()
{
double[] copy = new double[genes.Count];
for(int i = 0; i < copy.Length; i++)
// 10% chance to mutate, change up to 10%
copy[i] = genes[i] + (Program.rand.Next(10) < 1 ?
genes[i] * 0.2 * (Program.rand.NextDouble() - 0.5) : 0.0);
return Activator.CreateInstance(GetType(), copy);
}