c# 泛型集合和接口的 OOD 问题

时间:2021-07-09 10:50:53

标签: c# oop generics collections interface

我试图以如下方式模拟问题:

  1. Schedule.Products 集合可以同时包含:IProducts 和 IProductsWithConfig
  2. 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; }
    }

1 个答案:

答案 0 :(得分:1)

继承的想法是您可以在需要 IProduct 的任何情况下使用 IProduct 的任何派生版本。实现 IProductWithConfig 的类的每个实例都是通过定义实现 IProduct 的实例。 Fildor 的评论是有道理的:使 IProduct 抽象并从中创建一个新的后代。

或者您可以隐藏公共属性 Config 并通过一些方法(例如 Add(Product) 和只读 IEnumerable)公开这些属性。然后你可以控制将什么样的对象添加到集合中。