避免复制&;在子类中粘贴几乎通用的代码

本文关键字:代码 复制 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)
  }
}

如果你不想有一个静态扩展。