使用不同的预设模板创建类的实例

时间:2015-04-11 18:12:28

标签: c# class templates object visual-studio-2013

我正在使用C#Visual Studio' 13上的应用程序,我只是打了一个砖墙 - 我敢打赌,这是一个新手砖墙。我有一堂课 - 让我们说它是一个汽车课。它不是,但它是这个问题的一个很好的例子。

现在,我想创建 - 我不确定这是正确的术语 - 模板,我想从中创建实例。这些创建的实例将存储在List<Car>对象中。

我们只是说汽车类有名称,型号年份和里程属性。我希望能够创建一个模板,在那里我可以调用构造函数来创建一个具有预设名称和型号年份的汽车,但是随机里程 - 并且有几个不同的。也许以这种方式在构造函数中使用它,我有几组预设 - 或模板 - 例如&#39; 99宝马,&#39; 03 Merc和a&#39; 79 Lada。当我打电话给构造函数时,我希望选择其中一个模板,然后添加随机里程。

添加随机里程不是问题。事实上,构建这个问题没有问题,除了我的生活,我无法弄清楚如何在构造函数中做模板。

1 个答案:

答案 0 :(得分:2)

一些硬编码的预定义实例值的最简单解决方案之一是factory pattern。对于以下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 commentprototype pattern的建议创建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;
}

正如您所看到的,在选择要修复的属性时,您有很多可能性,这些属性应该是随机的,并且可以省略为可配置。

您可以使用的另一个相似的模式是{{3}}。

以下是如何将这两种模式结合起来创建一辆随机汽车:

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

可能性是无数的 - 这只是一个简单的例子,并不一定非常适合你的场景。然而,通常情况下,特别是对于初学者来说,最好是实现一些东西,看看它是如何工作的,用自己的眼睛看待它的优点和缺陷,然后尝试改进它。