Iremos adicionar uma interface base do repositorio que recebe uma classe generica
Nota: “Uma interface é um contrato que diz para uma classe concreta quais metodos devem ser implementados, e quais serão os retornos (se hovuer algum retorno) e parametros desses metodos”.

Agora podemos criar a interface especializada do repositorio de cliente, onde essa interface herda de IRepositoryBase e dessa vez informa a classe que vai ser usada (Cliente). Nota: Nesse momento do projeto não necessitamos que a interface de IClienteRepository tenha metodos além dos herdadas de IRepositoryBase, por isso não precisamos declarar nenhum outro metodo.

Criaremos a classe concreta de RepositoryBase que implementa a Interface IRepositoryBase, note que como é uma classe generica, não sabemos qual classe especializada sera passada aos metodos, então usamos o Set<TEntity> para definir que a classe generica representa a classe especializada.

Vamos adicionar mais um repositorio, dessa vez para Cliente, iremos herdar de RepositoryBase e passaremos o Cliente como classe, assim o RepositoryBase agora sabe que estamos trabalhando com Cliente, e iremos implementar a interface de ClienteRepository. Como a classe base já atende a todos os requisitos da interface não precisamos adicionar nenhuma implementação extra, o que já se mostra uma grande vantagem na reutilização de codigo.
