如何在不依赖继承和随之而来的问题的情况下归档属性代码的类似可重用性?
使用继承的替代方法是接口或组合。但是,特别是对于属性,您有点卡住了。
-
接口不能像基类一样包含默认实现。因此,虽然您可以强制您的类使用正确的“组合属性结构”,但如果不在每个实现接口的类中实现可重用方法(或者你可以吗?休息后更多! em>)
-
Composition 在 C# 中根本不存在,您可以动态地将属性添加到类中(除非您对
Dictionary<string,string> 感到满意)。可能有一些人为的方法可以技术上让它发挥作用,但这不是一个好方法。
接口+扩展方法。
这里可以使用扩展方法来替换您在继承的基类中找到的可重用逻辑。
这样做有一个缺点:您希望在扩展方法中访问的属性必须是接口协定的一部分并且可以公开访问。
除了这个缺点之外,它还能满足您的所有其他要求。
首先,一个基于继承的例子:
public class Property
{
public string Name { get; set; }
public string Value { get; set; }
}
public class PropertyComposedObject
{
public List<Property> Properties { get; set; }
public Property GetProperty(string name)
{
return this.Properties.SingleOrDefault(x => x.Name == name);
}
}
public class Person : PropertyComposedObject
{
}
如果我们改用接口,我们将无法获得诸如共享GetNode(string) 方法之类的好处。您可以将其添加为接口的一部分,但随后每个实现类都将负责实现该方法(导致您在各处复制/粘贴相同的方法)。
没有扩展方法的接口示例:
public class Property
{
public string Name { get; set; }
public string Value { get; set; }
}
public interface IPropertyComposedObject
{
List<Property> Properties { get; set; }
Property GetProperty(string name);
}
public class Person : IPropertyComposedObject
{
public List<Property> Properties { get; set; }
public Property GetProperty(string name)
{
return this.Properties.SingleOrDefault(x => x.Name == name);
}
}
但是扩展方法允许我们定义可重用方法一次,但仍然可以从每个实现接口的类中访问它:
public class Property
{
public string Name { get; set; }
public string Value { get; set; }
}
public interface IPropertyComposedObject
{
List<Property> Properties { get; set; }
}
public class Person : IPropertyComposedObject
{
public List<Property> Properties { get; set; }
}
public static class IPropertyComposedObjectExtensions
{
public Property GetProperty(this IPropertyComposedObject obj, string name)
{
return obj.Properties.SingleOrDefault(x => x.Name == name);
}
}