Вернуть производный тип в производную функцию - PullRequest
2 голосов
/ 24 января 2012

У меня есть форма поиска, которая выполняет запросы, возвращающие списки объектов, которые являются подклассами класса Контакт .

Когда списки используются в видах сетки, свойства, которые существуют только вподклассы (такие как HireDate ) не отображаются, так как список содержит объекты базового класса ( Contact ).

Есть ли способ сделать GetContacts в подклассе возвращает список Сотрудник вместо списка Контакт ?Или способ «бросить» список Контакт в список Сотрудник ?

Заранее спасибо!

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);  
} 

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Да, здесь могут помочь дженерики:

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);  
}

Кроме того, вы можете использовать метод LINQ OfType , чтобы получить все контакты нужного типа из вашей коллекции:

IEnumerable<Employee> employees = contactManager.GetContacts("someSearchValue").OfType<Employee>();
1 голос
/ 24 января 2012

Вы можете использовать дженерики, что-то вроде этого:

public abstract class ContactManager<TContactType> 
    where TContactType : Contact 
{
    public abstract List<TContactType> GetContacts(string searchValue);  
}

public abstract class EmployeeManager : ContactManager<Employee> 
{
    ...
}

Это позволяет вам ограничить ContactManager для работы с конкретным конкретным базовым типом (например, Contact) и далее использовать конкретный тип (Contact) для детализации с использованием строгой типизации, например, Employee.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...