簡體   English   中英

如何使具有類型約束的泛型集合實現兩個接口?

[英]How to make a Generic Collection with Type Constraint that implement two interfaces?

對不起,我在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

{

}

不幸的是它沒有工作,現在我很困惑,不知道該怎么做,請幫助,謝謝

您可以這樣做:

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#中沒有這樣的功能。 抱歉!

目前尚不清楚您要做什么:創建自己的通用容器或使用List<T>存儲不同的對象。

但據我了解,您需要這樣的東西:

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

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

更新

只需創建一個繼承所有要使用的接口的接口即可,例如:

interface IEmployeeWithSalery: IEmployee, ISalery {}
List<IEmployeeWithSalery> employees = new List<IEmployeeWithSalery>()

這聽起來很像我的問題,即存儲一個實現多個接口的對象,該對象源自我幾周前問的某個基礎(.net) 我提供了一種可能的解決方法,它可能比定義和使用一些“組合”接口類型還要耗費更多精力,但是它的優點是可以定義一個對象,以與適當定義的接口的任何特定組合一起工作,而不必定義一個該組合的新的“組合”界面類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM