Retornar tipo derivado na função derivada
-
13-11-2019 - |
Pergunta
Tenho um formulário de busca que executa consultas retornando listas de objetos que são subclasses de uma Contato aula.
Quando as listas são usadas em gridviews, propriedades que existem apenas em subclasses (como Data de contratação) não são exibidos porque a lista contém objetos da classe base (Contato).
Existe uma maneira de fazer ObterContatos na subclasse retorne uma lista de Funcionário em vez de uma lista de Contato ?Ou uma forma de "lançar" a lista de Contato em uma lista de Funcionário ?
Desde já, obrigado !
public abstract class Contact
{
public string Name { get; set; }
}
public class Employee : Contact
{
public DateTime HireDate { get; set; }
}
public abstract class ContactManager
{
public abstract List<Contact> GetContacts(string searchValue);
}
public class EmployeeManager : ContactManager
{
public abstract List<Contact> GetContacts(string searchValue);
}
Solução
Sim, os genéricos podem ajudar aqui:
public abstract class ContactManager<T> where T : Contact
{
public abstract List<T> GetContacts(string searchValue);
}
public class EmployeeManager : ContactManager<Employee>
{
public abstract List<Employee> GetContacts(string searchValue);
}
Alternativamente, você pode usar o Método LINQ OfType para obter todos os contatos de um tipo desejado da sua coleção:
IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();
Outras dicas
Você poderia usar genéricos, algo assim:
public abstract class ContactManager<TContactType>
where TContactType : Contact
{
public abstract List<TContactType> GetContacts(string searchValue);
}
public abstract class EmployeeManager : ContactManager<Employee>
{
...
}
Isso permite que você restrinja ContactManager
para trabalhar com um tipo de base específico (ou seja, Contact
) e ainda usar o tipo específico (de Contact
) para detalhar com digitação forte, por exemplo, com Employee
.