代码之家  ›  专栏  ›  技术社区  ›  Saurabh Agrawal

存储库模式:泛型与多态实现方式

  •  1
  • Saurabh Agrawal  · 技术社区  · 6 年前

    通用存储库界面如下所示:

     public interface IRepository<T> where T : Entity
    {
        T Get(int key);
    
        IQueryable<T> Get();
    
        void Save(T obj);
    
        void Delete(T obj);
    }
    

    实现类似功能的另一种方法是使用多态性,如下所示

    public interface IRepository
    {
        Entity Get(int key);
    
        IQueryable<Entity> Get();
    
        void Save(Entity obj);
    
        void Delete(Entity obj);
    }
    

    一般来说,我的问题是在什么场景或用例中我们应该使用泛型?如果我们使用多态性,可以完全避免泛型吗?或者我完全没有意义,这两个完全无关。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Edwin Dalorzo    6 年前

    type safety

    Entity Customer

    T

    IRepository<Customer> custRepo = ...;
    

    public interface IRepository
    {
        Customer Get(int key);
        IQueryable<Customer> Get();
        void Save(Customer obj);
        void Delete(Customer obj);
    }
    

    Customer customer = custRepo.Get(10);
    customer.setEmail("lskywalker@gmail.com");
    custRepo.Save(customer);
    

    Employee employee = empRepo.Get(10);
    custRepo.Save(employee); //Uh oh! Compiler error here
    

    IRepository custRepo = ...;
    Entity customer = custRepo.Get(10); 
    ((Customer) customer).setEmail("lskywalker@gmail.com"); //Now you'll need casting
    custRepo.Save(customer);
    

    Entity employee = empRepo.Get(10);
    custRepo.Save(employee); //Uh Oh! 
    

    CustomerRepo

    parametric polymorphism other answer

    Object

    holly war

    Dynamically–Typed Languages

    IronRuby IronPython