【发布时间】:2021-07-09 10:50:53
【问题描述】:
我正在尝试以以下方式对问题进行建模:
- Schedule.Products 集合可以同时包含:IProducts 和 IProductsWithConfig
- ProductWithConfig.Config 集合只能包含 IProducts 而不是 IProductsWithConfig
我有点卡住了——就像现在一样(如下),我无法阻止将 IProductsWithConfig 添加/包含在 ProductWithConfig.Config 中。任何想法如何以优雅的方式对其进行编码?
interface ISchedule
{
IEnumerable<IProduct> Products { get; set; }
}
interface IProductWithConfig : IProduct
{
IEnumerable<IProduct> Config { get; set; }
}
interface IProduct
{
int Id { get; set; }
}
【问题讨论】:
-
我不知道它如何适合您的设计,但如果您有另一个继承
IProduct的接口 - 比如说IPlainProduct- 那么这将是is-a IProduct而不是is-a IProductWithConfig。 ..你可以有IEnumerable<IPlainProduct> Config { get; set; } -
@Fildor 但 IPlainProduct 将是一个从 IProduct 继承的空接口?
-
可能是。但这并没有什么坏处。
-
其实,如果我没记错的话,我认为第 2 点违反了里氏替换原则。
-
基本上这里的问题是:你设计的“有一个配置”意味着“成为一个潜在的配置元素”。但是在您的第二个要求中,您将“拥有配置”和“成为配置”单向独占。想想这个和我上面的解决方案:它甚至可能还不够。如果你有一个实现两个接口的类(这是完全合法的)怎么办? ...
标签: c# oop generics collections interface