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

时间:2015-11-28 18:24:38

标签: c# inheritance subclass

我目前有一个类,它封装了一个类型化对象列表,并实现了一些像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中,我没有任何代码,但是我失去了键入列表的所有好处。

2 个答案:

答案 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更好更清洁。

以下是一些可能有用的参考资料: