我目前有一个类,它封装了一个类型化对象列表,并实现了一些像IEnumerable这样的接口。我需要一个额外的,稍微不同的属性的第二类。因此,我将创建一个基类A,并从A中派生出新的B类和新的C类。
但是我有代码(例如,像使用代理的代码一样)在B和C中几乎相同。唯一的区别是B中的代码搜索类型对象的私有列表(让我们说Person)和C中的代码搜索不同对象的私有列表(让我们说动物):
private static bool Find(Person xx)
{
if (xx.Id == someID)
{
return true;
}
else
{
return false;
}
}
由于我想避免复制/粘贴,我的问题是:避免这样的事情的好策略是什么?
我想象的唯一方法是在A中声明一个通用对象列表,并将A中的方法指向它。在B和C中,我没有任何代码,但是我失去了键入列表的所有好处。
答案 0 :(得分:0)
我很想拥有像ICanBeFoundById
public interface ICanBeFoundById
{
int Id {get;}
}
然后人和动物都可以从中继承,你可以做类似
的事情public static class FindExtensions
{
public static bool Find(this IEnumerable<ICanBeFoundById> xs, int someID)
{
return xs.Any(x=>x.Id == someID)
}
}
警告:我甚至没有检查过这是否会编译:)
当然你可以有一些
public abstract class BaseRepository<ICanBeFoundById>
{
private IEnumerable<ICanBeFoundById> _xs;
public static bool Find(int someID)
{
return xs.Any(x=>x.Id == someID)
}
}
如果您不想拥有静态扩展程序。
答案 1 :(得分:0)
1)我会看到在编写A类时是否可以使用泛型
public class cA<T>
{
private IEnumerable<T> _myPrivateData
public bool Find(args)
{
// Do stuff with _myPrivateData
}
}
public class cB : cA<TheTypeIWant>
{
// more stuff here if needed
}
2)您可以使用属性覆盖功能+使用protected
访问修饰符来执行以下操作:
public class cA
{
protected IEnumerable<Object> MyData { get; set; }
public bool Find(args)
{
// Do stuff with MyData
}
}
public class cB : cA
{
protected new IEnumerable<MyOtherDataType> MyData { get; set; }
}
当然MyOtherDataType
必须从用于此方法的基类型继承。我真的不会推荐这种方法。选项1更好更清洁。
以下是一些可能有用的参考资料: