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);
}