2012-02-08 76 views
1

我正在模擬一個生態系統,它非常簡單,所以不要擔心現實主義。 的再現方法位於生物類,它可以完全按類植物中,除了這是生物的返回類型:如何使返回類型的當前類,方法將使用的子類

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

我知道在Ruby中它可能返回「自我」,所以如果該方法由擴展該方法的類使用,該方法將返回繼承類的對象。

所以問題是:我怎樣才能修改這個方法,以便當它從一個工廠調用時,它將生成一個工廠並返回一個?

回答

4

您將需要使用泛型。最簡單的方法是使這種方法通用。你會遇到的一個問題是你必須有一個公共無參數的構造函數。

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

然後你會這樣調用這個方法。

Plant myPlant = new Plant(); 
Plant newPlant = myPlant.Reproduce<Plant>(); 

我會更進一步,讓這個單獨的類,使測試更容易。甚至可能是擴展方法。

public static class OrganismReproducer : IOrganismReproducer 
{ 
    public static TOrganism Reproduce<TOrganism>(this TOrganism organism) 
     where TOrganism : Organism, new() 
    { 
     double[] copy = new double[organism.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; 
    } 
} 

然後你可以這樣調用它。

Plant myPlant = new Plant(); 
Plant newPlant = myPlant.Reproduce(); 
    // no need to specify generic type parameter 
    // it is inferred based on the type of myPlant 
+0

謝謝我正在與第一個選項。 – MrFox 2012-02-11 12:48:33

0

你需要看看OO設計在這裏。該方法可以返回生物體或植物都從其繼承的基類,同時覆蓋Reproduce()並返回它們自己類型的實例作爲該基類型。或者植物可以從生物體繼承並且覆蓋返回植物作爲生物體的實例化的方法。

(注:我不是生物學家,所以我不知道,如果一個工廠是一個有機體)

1

您可以使用反射,但有一個父類調用它的子類的構造函數看起來腥

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); 
} 
相關問題