簡體   English   中英

使用不同的預設模板創建類的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM