C#属性完全相同,在两个地方定义

Sar*_*els 3 .net c# inheritance properties

我有以下课程:

  1. Defect - 表示可以在数据库中找到的一种数据
  2. FilterQuery - 提供了一种通过设置简单的布尔过滤器来查询数据库的方法

两者DefectFilterQuery实现相同的接口: IDefectProperties.此接口指定数据库中的特定字段.不同的类具有返回Defect实例列表的方法.使用FilterQuery,为特定属性指定一些过滤器IDefectProperties,然后运行查询并返回Defect实例列表.

我的问题是我最终在FilterQuery和中实现了一些完全相同的属性Defect.这两个本质上是不同的类,它们只是共享一些相同的属性.例如:

public DateTime SubmitDateAsDate
{
    get { return DateTime.Parse(SubmitDate); }
    set { SubmitDate = value.ToString(); }
}
Run Code Online (Sandbox Code Playgroud)

这是一个所需的属性IDefectProperties,取决于一个不同的属性SubmitDate,它返回一个string而不是一个DateTime.现在SubmitDateDefect和中的实现方式不同FilterQuery,但SubmitDateAsDate完全相同.有没有办法,我可以定义一个方法SubmitDateAsDate中唯一的地方,但两者DefectFilterQuery提供它作为一个属性? FilterQuery并且Defect已经从两个不同的类继承,我认为无论如何共享一个祖先是没有意义的.我也愿意接受有关我的设计的建议.

Jam*_*iec 5

当继承没有意义时,组合通常会这样做.

internal class DefectPropertyInternal
{
  private IDefectproperty dp
  public DefectPropertyInternal(IDefectproperty dp)
  {
     this.dp = dp;
  }

  public DateTime SubmitDateAsDate
  {
    get { return DateTime.Parse(dp.SubmitDate); }
    set { dp.SubmitDate = value.ToString(); }
  }

}

public class Defect : IDefectProperty
{
  private DefectPropertyInternal dpi;

  public Defect()
  {
     this.dpi = new DefectpropertyInternals(this);
  }

 public DateTime SubmitDateAsDate
 {
    get { return dpi.SubmitDateAsDate; }
    set { dpi.SubmitDateAsDate = value; }
 }

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,DefectPropertyInternals实现了FilterQuery和Defect的所有共享功能,而无需在每个类中重复这一功能.

  • 究竟,这真的能节省多少?对于很有用的组合物来说,这些属性必须要复杂得多. (2认同)