2015-02-19 2 views
0

Скажем, у меня есть что-то вроде: Транспортные средства.
Под транспортными средствами у меня есть автомобили, грузовики и пикапы.
Под машинами У меня только BMW и Toyota.Класс или Enum для ограничения параметра функции на список допустимых значений C#

Теперь я хочу назвать что-то вроде:

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

Так NumberOfSeats должно быть ограничено только получить BMW и Toyota:

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

Но это должно дать компиляции ошибки времени, если я позвоню:

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

Кроме того, мне хотелось бы, чтобы у BMW был метод, который вернет строковое значение (le t'say Name())

Должен ли мой классный состав смотреть на перечисления, классы, наследование или комбинацию?

+1

Поставил бы 'NumberOfSeats' как виртуальную собственность объекта' Vehicle' решить вашу проблему? – dasblinkenlight

+2

Можете ли вы объяснить, чего вы пытаетесь достичь. Я думаю, вам нужен абстрактный базовый класс 'Vehicle' с методом' NumberOfSeats'. Если это вопрос дизайна - лучше [программисты] (http://programmers.stackexchange.com/). –

+1

Это выглядит как запах дизайна, а также как проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Попытайтесь описать, чего вы пытаетесь достичь. –

ответ

3

Я думаю, вы думаете в обратном направлении. Мой образ мышления заключается в том, чтобы создать аналогию между объектами реального мира и классами программного обеспечения (это мой подход к объектно-ориентированному мышлению).

Когда я рассматриваю сценарий реального мира, в мире нет такой вещи, как «количество мест». Это свойство транспортного средства. Автомобили имеют это имущество автобусы имеют это свойство, Автомобили обычно имеют 4 (или 5) места, автобусы имеют 45 и т. Д.

Так что я бы использовал его как свойство транспортного средства самостоятельно. Таким образом, это будет более значимым. Такие как:

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"); 
Смежные вопросы