Насколько глубоко вы берете Has-a, когда дело доходит до объектно-ориентированного дизайна? - PullRequest
3 голосов
/ 10 марта 2010

Если я скажу, что у автомобиля есть определенное количество шин, размер шин, марка шин, то я предполагаю, что смогу создать такой класс:

public class Car
{
    public int TireCount {get;set;}
    public float TireSize {get;set;}
    public string TireBrand {get;set;}
}

С другой стороны, я могу сделать Tire классом, а затем сделать это свойство класса Car следующим образом:

public class Tire
{
   public int Count {get;set;}
   public float Size {get;set;}
   public string Brand {get;set;}
}

public class Car
{
    public Tire tire {get;set;}
}

Какой способ лучше? Насколько глубоко я принимаю отношения? Возможно ли переопределить объект, если что-то такое, как поговорка?

Ответы [ 3 ]

3 голосов
/ 10 марта 2010

Глубоко, насколько это имеет смысл для вашего приложения.

В вашем примере ваш класс Car будет иметь несколько свойств, связанных с шинами ... так что класс Tire (или набор Tire s) имеет смысл. Возможно что-то вроде:

public class Tire
{
    public float Size {get; set;}
    public string Brand {get; set;}
}

public class Car
{
    public List<Tire> Tires {get; private set;}
}

Тогда вы могли бы сделать:

Car myCar = new Car();

// Some initialization here

int tireCount = myCar.Tires.Count();

Чтобы узнать количество шин.

2 голосов
/ 10 марта 2010

Лично я хотел бы, чтобы "Размер" и "Бренд" были членами Тира, поскольку они специфичны для конкретного типа Шины.

С другой стороны, у автомобиля, вероятно, должна быть коллекция шин, поскольку у вас (теоретически) может быть несколько шин разных типов.

Я бы сделал это больше как:

public class Tire
{
    public float Size {get;set;}
    public string Brand {get;set;}
}

public class Car
{
    public IList<Tire> Tires {get; private set;}
}
1 голос
/ 10 марта 2010

Я бы пошел, пока не буду уверен, что мне не придется дублировать информацию

в этом случае мне может понадобиться только экземпляр шины

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...