C# 为什么列表类实现IList接口?
我的问题可能有点愚蠢,但我真的想知道,为什么集合层次结构的设计方式是包含接口和类,而它可能只是类或顶部的一个接口和rest类C# 为什么列表类实现IList接口?,c#,collections,interface,C#,Collections,Interface,我的问题可能有点愚蠢,但我真的想知道,为什么集合层次结构的设计方式是包含接口和类,而它可能只是类或顶部的一个接口和rest类 有人能给我解释一下原因吗?想想,如果只定义一个IList接口,那么就需要类来实现它列表就是这样的一种实现,如果您愿意的话,它是默认的 另一方面,如果只有一个列表作为抽象类(即没有IList接口),那么所有自定义列表集合类都必须继承。我认为这是一个糟糕的设计选择,因为IList的成员更适合契约(单个添加/删除方法可以有不同的实现,例如优先级列表等)。通过将列表作为抽象类提供
有人能给我解释一下原因吗?想想,如果只定义一个
IList
接口,那么就需要类来实现它<代码>列表就是这样的一种实现,如果您愿意的话,它是默认的
另一方面,如果只有一个列表作为抽象类(即没有IList
接口),那么所有自定义列表集合类都必须继承。我认为这是一个糟糕的设计选择,因为IList
的成员更适合契约(单个添加/删除方法可以有不同的实现,例如优先级列表等)。通过将列表作为抽象类提供,您将强制并控制人们的设计选择
此外,在C#中,您还将受到额外的限制,无法为自定义集合从任何其他类继承
基本上,您应该尝试查看接口和抽象类提供的不同功能。这将使您认识到IList和List之间的区别。想想,如果您只定义了一个
IList
接口,那么您需要类来实现它<代码>列表就是这样的一种实现,如果您愿意的话,它是默认的
另一方面,如果只有一个列表作为抽象类(即没有IList
接口),那么所有自定义列表集合类都必须继承。我认为这是一个糟糕的设计选择,因为IList
的成员更适合契约(单个添加/删除方法可以有不同的实现,例如优先级列表等)。通过将列表作为抽象类提供,您将强制并控制人们的设计选择
此外,在C#中,您还将受到额外的限制,无法为自定义集合从任何其他类继承
基本上,您应该尝试查看接口和抽象类提供的不同功能。这将使您认识到IList和List之间的区别。每个类只能从一个类派生,但可以从多个接口派生。
为什么我们需要多个接口?
通常有两个原因导致一个类有多个接口,1。一个类可以有不同类型的行为,2。开闭原理
接口的一个简短定义是:接口是一个确定派生类必须如何行为的实体,由于存在不同类型的行为,我们需要为每个类提供可能不同的接口。
此外,根据SOLID的第二个原则,它是开闭原则的缩写,这意味着实体必须为扩展而打开,但为修改而关闭,即使您想向特定类添加新行为(例如,
CanBark
),并且您已经有了相关的接口(IDogActions
)因此,作为类的父类,建议不要修改IDogActions
接口,因为可能有许多其他类实现此接口,并且不需要新操作,相反,您可以创建一个新接口(例如IDogAuditoryActions
).每个类只能从一个类派生,但可以从多个接口派生。为什么我们需要多个接口?
通常有两个原因导致一个类有多个接口,1。一个类可以有不同类型的行为,2。开闭原理
接口的一个简短定义是:接口是一个确定派生类必须如何行为的实体,由于存在不同类型的行为,我们需要为每个类提供可能不同的接口。
此外,根据SOLID的第二个原则,它是开闭原则的缩写,这意味着实体必须为扩展而打开,但为修改而关闭,即使您想向特定类添加新行为(例如,
CanBark
),并且您已经有了相关的接口(IDogActions
)因此,作为类的父类,建议不要修改IDogActions
接口,因为可能有许多其他类实现此接口,并且不需要新操作,相反,您可以创建一个新接口(例如IDogAuditoryActions
).因为IList
不仅仅由List
类实现。此外,C#不允许多重继承,因此如果您有一个公共抽象类,您也不能从另一个类继承。因为IList
不仅仅由List
类实现。另外,C#不允许多重继承,因此如果您有一个公共抽象类,那么您也不能从另一个类继承。