【问题标题】:Creating instances of a class with different preset templates使用不同的预设模板创建类的实例
【发布时间】:2015-04-11 18:12:28
【问题描述】:

我正在开发 C# Visual Studio '13 上的应用程序,但我刚刚碰到了一块砖墙——我敢打赌这是一个新手砖墙。我有一门课——可以说这是一门汽车课。不是,但它是这个问题的一个很好的例子。

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

假设汽车类具有名称、车型年份和里程属性。我希望能够创建一个模板,我可以在其中调用构造函数来创建具有预设名称和型号年份的汽车,但里程数是随机的 - 并且有几个不同的。也许以这样的方式在构造函数中使用它,我有几组预设 - 或模板 - 例如'99 宝马、'03 Merc 和 '79 拉达。当我调用构造函数时,我希望它选择其中一个模板,并添加一个随机里程。

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

【问题讨论】:

  • 你不'在构造函数中做模板',你写了一个 CarFactory 类。也许还有一个 CarTemplate 类。

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


【解决方案1】:

对于一些硬编码的预定义实例值,最简单的解决方案之一是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 在他的comment 中的建议创建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;
}

如您所见,在选择要修复哪些属性、哪些应该是随机的以及哪些可以配置时,您有很多可能性。

您可以在此处使用的另一种类似的模式是prototype pattern

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

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

可能性不计其数 - 这只是一个简单的示例,不一定最适合您的场景。但是,通常,尤其是对于初学者来说,最好实现一些东西,看看它是如何工作的,亲眼看看它的优点和缺陷,然后尝试改进它。

【讨论】:

  • 感谢您的快速答复。似乎我在以一种倒退的方式思考这个问题——而不是使用具有固定和随机属性的构造函数的明显方式。我缺少的最后一部分是如何随机化 CarFactory 创建的汽车?如果我用游戏术语来说:有一个随机遭遇,玩家在 CarFactory 对象中找到三辆汽车中的一辆。感谢您的帮助,尽管我一直觉得我只是错过了一些明显的东西。
  • 天哪,数组。当然。应该知道这是显而易见的事情。不过,我非常感谢您花时间回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多