避免复制&;在子类中粘贴几乎通用的代码
本文关键字:代码 复制 amp 子类 | 更新日期: 2023-09-27 18:25:03
我目前有一个类,它封装了一个类型化对象列表,并实现了一些接口,如IEnumerable。我需要第二个类,具有额外的、稍微不同的属性。因此,我将创建一个基类a,并从a派生出新的类B和新的类C。
然而,我有代码(例如,使用Delegates查找的代码),这在B和C中几乎相同。唯一的区别是,B中的代码搜索键入对象的私人列表(比如Person),而C中的代码则搜索不同对象的私人名单(比如Animal):
private static bool Find(Person xx)
{
if (xx.Id == someID)
{
return true;
}
else
{
return false;
}
}
由于我想避免复制/粘贴,我的问题是:避免这种情况的好策略是什么?
我想象的唯一方法是在a中声明一个泛型对象列表,并将a中的方法指向该列表。在B和C中,我将没有任何代码,但我失去了键入列表的所有好处。
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更好、更干净。
以下是一些可能被证明有用的参考文献:
- http://peisker.net/dotnet/covariance.htm
- C#:重写返回类型
我很想拥有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)
}
}
如果你不想有一个静态扩展。