C# 当涉及到面向对象设计时,您对Has-a的理解有多深?

C# 当涉及到面向对象设计时,您对Has-a的理解有多深?,c#,oop,C#,Oop,如果我说一辆车有一定数量的轮胎,轮胎尺寸,轮胎品牌,那么我猜我可以做这样一个分类: public class Car { public int TireCount {get;set;} public float TireSize {get;set;} public string TireBrand {get;set;} } 另一方面,我可以使轮胎成为一个等级,然后使其成为该等级汽车的一个属性,如下所示: public class Tire { public int

如果我说一辆车有一定数量的轮胎,轮胎尺寸,轮胎品牌,那么我猜我可以做这样一个分类:

public class Car
{
    public int TireCount {get;set;}
    public float TireSize {get;set;}
    public string TireBrand {get;set;}
}
另一方面,我可以使轮胎成为一个等级,然后使其成为该等级汽车的一个属性,如下所示:

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;}
}
更好的办法是什么?我对这种关系有多深?如果有这样的说法,是否有可能超越对象?

我个人认为“尺寸”和“品牌”是轮胎的成员,因为它们是特定类型轮胎的特定成员

另一方面,汽车应该有一组轮胎,因为(理论上)可以有多个不同类型的轮胎

我更愿意这样做:

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

public class Car
{
    public IList<Tire> Tires {get; private set;}
}
公共级轮胎
{
公共浮点大小{get;set;}
公共字符串品牌{get;set;}
}
公车
{
公共IList轮胎{get;private set;}
}

尽可能深入地了解您的应用程序。

在您的示例中,您的
汽车
类将具有多个与轮胎相关的属性…因此
轮胎
类(或
轮胎
的集合)是有意义的。可能是这样的:

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

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

获取轮胎数量。

我会一直这样做,直到我确定不必重复信息


在这种情况下,我可能只需要一个轮胎实例

同意收集。刚刚做了一个快速样品。谢谢。这一切都源于我看了一些用c#编写的DICOM API,它们似乎将DICOM文件的各个方面都变成了一个对象。@Reed Copsey-没有想到这一点。再次感谢你的提示。老兄…我今天被大男孩们揍了一顿。先是乔恩·斯凯,然后是乔尔·科霍恩,现在是里德·科佩-P@Justin当前位置嘿嘿,我不打!你写的东西基本上和我写的一样;)这既是一种
关系,又是一种
关系。当你谈论继承时,通常使用短语
is-a
。你是对的。让我来纠正这个问题。您使用List和Reed使用IList有什么特别的原因吗?因为他使他的代码更通用(而且可以说质量更高)。使用his,您可以实现实现IList接口的任何类型的集合,而不会破坏二进制兼容性。我的只是一个简单的例子。@Xaisoft:通常,您希望在公共API中使用对您限制最少的接口或类。如果您想要“类似列表”的语义,那就是IList。如果只需要遍历集合(即:使用foreach),则使用IEnumerable。这使您可以在内部使用任何形式的集合,并随时更改它。
Car myCar = new Car();

// Some initialization here

int tireCount = myCar.Tires.Count();