【问题标题】:Class or Enum to restrict function parameter to list of valid values c#类或枚举将函数参数限制为有效值列表c#
【发布时间】:2015-02-19 07:36:03
【问题描述】:

假设我有类似的东西: 车辆。
在车辆下方,我有汽车、卡车和皮卡。
下面的车我只有宝马和丰田。

现在我想这样称呼:

if (NumberOfSeats(Vehicles.Cars.Toyota) {}

所以 NumberOfSeats 应该被限制为只接收 BMW 和 Toyota:

public int NumberOfSeats(??) { return 4;}

但是如果我调用它应该会给出编译时错误:

if (NumberOfSeats(Vehicles.Cars.Yamaha) {}

此外,我想有一个 BMW 方法,它会返回一个字符串值(比如说Name()

我的类组合应该查看枚举、类、继承还是组合?

【问题讨论】:

  • NumberOfSeats 作为Vehicle 对象的虚拟属性可以解决您的问题吗?
  • 你能解释一下你想要达到的目标吗?我认为你需要一个抽象基类Vehicle 和方法NumberOfSeats。如果这是设计问题——programmers 将是一个更好的地方。
  • 这看起来像设计味道,也像XY problem。试着描述你想要达到的目标。
  • 这并不是枚举的真正用途,我同意 Sriram 的观点,你最好创建一个可以被覆盖的方法(或属性)
  • Tx,我想要达到的真正目的是拥有一个固定的汽车名称列表(不是对象的实例),我想将此固定名称传递给一个方法。所以 NumberOfSeats 在这种情况下不是一个属性(尽管现实世界的对象会有意义)。也许我将不得不重新考虑一下这个问题的措辞。谢谢大家。

标签: c# class enums


【解决方案1】:

我猜你是在倒退。我的思维方式是在现实世界的对象和软件类之间进行类比(这是我的面向对象思维方式)。

当我考虑现实世界的场景时,世界本身并不存在“座位数”之类的东西。它是车辆的财产。汽车有这个属性公共汽车有这个属性,汽车通常有4个(或5个)座位,公共汽车有45个等。

所以我会将它实现为车辆的属性而不是 self 方法。这样会更有意义。如:

public interface IVehicle
{
    int NumberOfSeats { get; }
    string Brand { get; set; }
}

public class Car : IVehicle
{
    public int NumberOfSeats { get; private set; }
    public string Brand { get; set; }

    public Car(int noofseats, string brand)
    {
        this.NumberOfSeats = noofseats;
        this.Brand = brand;
    }
}

Car bmw = new Car(4, "BMW");
Car toyota = new Car(4, "Toyota");
Car qashqai = new Var(7, "Nissan");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多