我有以下类(class):
Defect
- 表示可以在数据库中找到的一种数据FilterQuery
- 提供一种通过设置简单的 bool 过滤器来查询数据库的方法
Defect
和FilterQuery
实现相同的接口(interface):IDefectProperties
。此接口(interface)指定数据库中的特定字段。不同的类具有返回 Defect
实例列表的方法。使用 FilterQuery
,您可以为作为 IDefectProperties
的一部分实现的特定属性指定一些过滤器,然后运行查询并返回 Defect
列表> 实例。
我的问题是我最终在 FilterQuery
和 Defect
中实现了一些完全相同的属性。两者本质上是不同的类,它们只是共享一些相同的属性。例如:
public DateTime SubmitDateAsDate
{
get { return DateTime.Parse(SubmitDate); }
set { SubmitDate = value.ToString(); }
}
这是 IDefectProperties
所需的属性,它依赖于不同的属性 SubmitDate
,它返回一个 string
而不是 日期时间
。现在SubmitDate
在Defect
和FilterQuery
中的实现方式不同,但是SubmitDateAsDate
是完全一样的。有没有一种方法可以只在某个地方定义 SubmitDateAsDate
,但 Defect
和 FilterQuery
都将其作为属性提供? FilterQuery
和 Defect
已经继承自两个不同的类,我认为无论如何它们共享一个祖先是没有意义的。我也乐于接受关于我在这里的设计的建议。
最佳答案
当继承没有意义时,组合通常可以。
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/