C#属性完全一样,定义在两个地方

标签 c# .net inheritance properties

我有以下类(class):

  1. Defect - 表示可以在数据库中找到的一种数据
  2. 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 而不是 日期时间。现在SubmitDateDefectFilterQuery中的实现方式不同,但是SubmitDateAsDate是完全一样的。有没有一种方法可以只在某个地方定义 SubmitDateAsDate,但 DefectFilterQuery 都将其作为属性提供? FilterQueryDefect 已经继承自两个不同的类,我认为无论如何它们共享一个祖先是没有意义的。我也乐于接受关于我在这里的设计的建议。

最佳答案

当继承没有意义时,组合通常可以。

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; }
 }

}

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

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

相关文章:

用于 GetWindowDpiAwarenessContext 的 c# Pinvoke

java - 安卓Java : Choose dynamically a subtype class

c# - MVC 2 - URL 缩短/路由(映射路由)

c# - 计算 *newb* 之外的数组的总和

c# - 在 Foreach 关键字中等待

.net - WPF TabControl 中的滚动内容溢出

.net - 为什么 .NET Framework 中没有 IQueue<T> 或 IStack<T> 接口(interface)?

c++ - 为什么我的析构函数只被调用一次而不是在 delete(a) 调用中?

java - 重构子类 - 如何组合实例方法?

c# - 如何在通过管道进行Azure DevOps部署期间删除本地wwwroot文件夹的内容?