我可以用基类中的方法组合替换派生类中的这些方法吗?

本文关键字:方法 组合 基类 我可以 替换 派生 | 更新日期: 2023-09-27 18:18:27

我有这样的方法:

   public void AddOrUpdate(Product product)
    {
        try
        {
            _productRepository.AddOrUpdate(product);
        }
        catch (Exception ex)
        {
            _ex.Errors.Add("", "Error when adding product");
            throw _ex;
        }
    }

    public void AddOrUpdate(Content content)
    {
        try
        {
            _contentRepository.AddOrUpdate(content);
        }
        catch (Exception ex)
        {
            _ex.Errors.Add("", "Error when adding content");
            throw _ex;
        }
    }

加上更多的方法,不同之处在于传递给它们的类。

是否有一些方法,我可以在基类中编码这些方法,而不是在每个派生类中重复方法?我在想基于泛型的东西,但我不确定如何实现,也不确定如何在_productrerepository中传递。

供参考,_productRepository和_contentRepository是这样定义的:

    private void Initialize(string dataSourceID)
    {
        _productRepository = StorageHelper.GetTable<Product>(dataSourceID);
        _contentRepository = StorageHelper.GetTable<Content>(dataSourceID);
        _ex = new ServiceException();
    }

我可以用基类中的方法组合替换派生类中的这些方法吗?

是的,你可以。

实现

的简单方法是使用接口和继承。紧耦合的

另一种方法是依赖注入。失去耦合,更可取。

还有一种方法是像下面这样使用泛型:

public void AddOrUpdate(T item ,V repo) where T: IItem, V:IRepository
{ 
  repo.AddOrUpdate(item)
}

class Foo
{
    IRepository _productRepository;
    IRepository _contentRepository
    private void Initialize(string dataSourceID)
    {
        _productRepository = StorageHelper.GetTable<Product>(dataSourceID);
        _contentRepository = StorageHelper.GetTable<Content>(dataSourceID);
        _ex = new ServiceException();
    }
    public void MethodForProduct(IItem item)
    {
       _productRepository.SaveOrUpdate(item);
    }
    public void MethodForContent(IItem item)
    {
       _contentRepository.SaveOrUpdate(item);
    }
}
// this is your repository extension class.
public static class RepositoryExtension
{
   public static void SaveOrUpdate(this IRepository repository, T item) where T : IItem
   {
      repository.SaveOrUpdate(item);
   }
}
// you can also use a base class.
interface IItem
{
   ...
}
class Product : IItem
{
  ...
}
class Content : IItem
{
  ...
}

尝试使用泛型方法,并在你的基类上实现它你可以试试这个链接:http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx