我有以下类(class):

  • Defect - 表示可以在数据库中找到的一种数据
  • FilterQuery - 提供一种通过设置简单的 bool 过滤器来查询数据库的方法
  • DefectFilterQuery 都实现了相同的接口(interface): IDefectProperties 。此接口(interface)指定数据库中的特定字段。不同的类具有返回 Defect 实例列表的方法。使用 FilterQuery ,您可以为作为 IDefectProperties 一部分实现的特定属性指定一些过滤器,然后运行查询并返回 Defect 实例列表。

    我的问题是我最终在 FilterQueryDefect 中实现了一些完全相同的属性。两者本质上是不同的类,它们只是共享一些相同的属性。例如:
    public DateTime SubmitDateAsDate
    {
        get { return DateTime.Parse(SubmitDate); }
        set { SubmitDate = value.ToString(); }
    }
    

    这是 IDefectProperties 所需的属性,它依赖于不同的属性 SubmitDate ,它返回 string 而不是 DateTime 。现在 SubmitDateDefectFilterQuery 中的实现不同,但 SubmitDateAsDate 是完全一样的。有没有一种方法可以只在某个地方定义 SubmitDateAsDate,但 DefectFilterQuery 都将其作为属性提供? FilterQueryDefect 已经从两个不同的类继承,我认为它们共享一个祖先是没有意义的。我也愿意接受关于我的设计的建议。

    最佳答案

    如果继承不合适并且您想重用代码,则必须使用组合(对于您描述的简单情况可能是过度使用)或 extension methods

    扩展方法是在 C# 中模拟多重继承的好方法,尽管没有扩展属性 ( "maybe someday" says Eric Lippert )。如果你愿意放弃属性语义,你可以这样做:

    public static DateTime GetSubmitDateAsDate(this IDefectProperties defectProperties) {
        return DateTime.Parse(defectProperties.SubmitDate);
    }
    
    public static void SetSubmitDateAsDate(this IDefectProperties defectProperties, DateTime dateTime) {
        defectProperties.SubmitDate = dateTime.ToString();
    }
    

    关于C#属性完全一样,在两处定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2700450/

    10-10 22:14