Как создать универсальную коллекцию с ограничением типов, которая реализует два интерфейса? - PullRequest
1 голос
/ 31 января 2011

извините, я не имел дело с дженериком в c #

в соответствии с этим вопросом , как сделать коллекцию generc которые реализуют два интерфейса Я искал прямой путь, как это: конечно, он делает ошибку и совершенно не так.

interface IEmployee {void DisplayInfo();}

interface ISalary {void CalculateSalary();}


class Nurse : IEmployee, ISalary
{
 //some Implementation
}


class Doctor : IEmployee, ISalary
{
 //some Implementation
}

class EntryPoint
{
 static void Main(string[] args)
  { 
  System.Collections.Generic .List<T>  employees where T: ISalary,IEmployee
   =new System.Collections.Generic .List<T>();
  }

 Nurse oNurse = new Nurse();
 Doctor oDoctor = new Doctor();

 employees.Add(oNurse);
 employees.Add(oDoctor);
}

после некоторого чтения я обнаружил, что, возможно, сначала я должен определить общий класс, подобный этому:

public class HospitalEmployee<T> where T : IEmployee, ISalary

{

}

и, к сожалению, это не работает, теперь я в замешательстве и не знаю, что именно делать, пожалуйста, помогите, спасибо

Ответы [ 3 ]

14 голосов
/ 31 января 2011

Вы можете сделать это следующим образом:

interface IEmployee { void DisplayInfo(); }
interface ISalaried { void CalculateSalary(); }
interface ISalariedEmployee : IEmployee, ISalaried {}
class Doctor : ISalariedEmployee { whatever }
class Nurse : ISalariedEmployee { whatever }
...
var list = new List<ISalariedEmployee>() { new Nurse(), new Doctor() };

Помогает ли это?

По сути, функция, которую вы действительно хотите, не существует.Есть способ сказать " этот параметр общего типа должен быть создан с аргументом типа, который реализует эти два интерфейса ", но, как ни странно, не существует способа сказать " эта локальная переменная должнабыть инициализирован ссылкой на объект, который реализует эти два интерфейса".Это просто недостаток системы типов C #, которую вы можете представить в параметрах типа, но не в локальных.То, что вы хотите:

var list = new List<IEmployee + ISalary>();

И теперь вы можете поместить в список только те вещи, которые реализуют оба интерфейса.Но в C # такой функции нет, к сожалению.Извините!

1 голос
/ 31 января 2011

Непонятно, что вы пытаетесь сделать: создайте свой собственный универсальный контейнер или используйте List<T> для хранения различных объектов.

Но, насколько я понял, тебе нужно что-то вроде этого:

List<IEmployee> employees = new List<IEmployee>();
Nurse oNurse = new Nurse();
Doctor oDoctor = new Doctor();

employees.Add(oNurse);
employees.Add(oDoctor);

UPDATE

Просто создайте интерфейс, который наследует все интерфейсы, которые хотите использовать, например:

interface IEmployeeWithSalery: IEmployee, ISalery {}
List<IEmployeeWithSalery> employees = new List<IEmployeeWithSalery>()
0 голосов
/ 15 февраля 2011

Это звучит очень похоже на мой вопрос Хранение объекта, который реализует несколько интерфейсов и происходит от определенной базы (.net) , которую я задал несколько недель назад. Я предлагаю возможный обходной путь, который может быть больше работы, чем определение и использование нескольких «комбинированных» типов интерфейса, но имеет преимущество в том, что можно определить объект для работы с любой конкретной комбинацией интерфейсов, которые определены соответствующим образом, без необходимости определять новый «комбинированный» тип интерфейса для этой комбинации.

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