我有以下类(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
而不是 DateTime
。现在 SubmitDate
在 Defect
和 FilterQuery
中的实现不同,但 SubmitDateAsDate
是完全一样的。有没有一种方法可以只在某个地方定义 SubmitDateAsDate
,但 Defect
和 FilterQuery
都将其作为属性提供? FilterQuery
和 Defect
已经从两个不同的类继承,我认为它们共享一个祖先是没有意义的。我也愿意接受关于我的设计的建议。 最佳答案
如果继承不合适并且您想重用代码,则必须使用组合(对于您描述的简单情况可能是过度使用)或 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/