[英]Creating instances of a class with different preset templates
我正在使用C#Visual Studio '13上的應用程序,但是我碰到了一個磚牆-我敢打賭,這是一個新手。 我有一堂課-可以說這是汽車課。 不是,但這是這個問題的一個很好的例子。
現在,我想創建-我不確定這是正確的術語-模板,我想從中創建實例。 這些創建的實例將存儲在List<Car>
對象中。
假設汽車類別具有名稱,型號年份和里程屬性。 我希望能夠創建一個模板,在其中可以調用構造函數來創建具有預設名稱和型號年份,但隨機行駛里程的汽車-並具有幾個不同的名稱。 也許以某種方式在構造函數中使用它,所以我有幾組預設-或模板-例如'99 BMW,'03 Merc和'79 Lada。 當我調用構造函數時,我希望它選擇這些模板之一,並添加一個隨機數。
增加隨機里程不是問題。 實際上,構建這個問題沒有問題,除了我一生都無法弄清楚如何在構造函數中做模板這一事實。
對於某些硬編碼的預定義實例值,最簡單的解決方案之一是工廠模式 。 對於以下Car
類別:
public class Car
{
public string Model { get; private set; }
public int Year { get; private set; }
public Color Color { get; private set; }
public int Mileage { get; private set; }
// ...
public Car(string model, int year, Color color, int mileage)
{
Model = model;
Year = year;
Color = color;
Mileage = mileage;
}
}
您可以按照Henk Holterman在評論中建議的方式創建CarFactory
。 例如:
public class CarFactory
{
public CarFactory()
{
random = new Random();
}
public Car CreateBMW99WithRandomMileage(Color color)
{
return new Car("BMW", 1999, color, random.Next());
}
public Car Create03BlackMerc(int mileage)
{
return new Car("Mercedes", 2003, Colors.Black, mileage);
}
public Car Create79Lada(Color color, int mileage)
{
return new Car("Lada", 1979, color, mileage);
}
// ...
private Random random;
}
如您所見,在選擇要修復的屬性,哪些是隨機的以及哪些可以保留為可配置時,您有很多可能性。
您可以在此處采用的另一個類似模式是原型模式 。
您可以通過以下兩種方法結合使用此方法來創建隨機汽車:
public class CarFactory
{
public CarFactory()
{
random = new Random();
black99BMW = new Car("BMW", 1999, Colors.Black, 0);
black03Merc = new Car("Mercedes", 2003, Colors.Black, 0);
black79Lada = new Car("Lada", 1979, Colors.Black, 0);
// ...
allCars = new Car[] { black99BMW, black03Merc, black79Lada };
}
public Car CreateBMW99WithRandomMileage(Color color)
{
return black99BMW.Clone(color, random.Next());
}
public Car Create03BlackMerc(int mileage)
{
return black03Merc.Clone(Colors.Black, random.Next());
}
public Car Create79Lada(Color color, int mileage)
{
return black79Lada.Clone(color, mileage);
}
public Car CreateRandomCar()
{
var index = random.Next(allCars.Length);
Color color = // pick random color
int mileage = random.Next();
return allCars[index].Clone(color, mileage);
}
private Car black99BMW;
private Car black03Merc;
private Car black79Lada;
private Car[] allCars;
}
可能性不計其數-這只是一個簡單的例子,並不一定最適合您的情況。 但是,通常,尤其是對於初學者,最好實施一些措施以了解其工作原理,親眼看看其優點和缺點,然后再嘗試對其進行改進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.