上下文:.NET 4.0,C#C#使用泛型和接口實現
我創建了一組接口和一組實現它們來提供某些服務的接口。客戶端使用具體類,但調用使用接口聲明的方法作爲參數類型。
一個簡單的例子是這樣的一個:
namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
的代碼對我來說很有意義,但我得到的編譯器錯誤:
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
我不知道我做錯了什麼,我在網上看了很多頁面,但沒有解決我的問題。
是否有不會改變什麼,我試圖建立,大部分的架構的解決方案:
編輯:我設計的接口的方式,使得他們應該獨立於實現它們的具體clases的。具體的clases可以從DLL加載,但大多數應用程序與接口一起工作。在某些情況下,我需要使用具體的clases,特別是在使用需要序列化的clases時。
在此先感謝。
亞歷
這會在協方差的境界之下。具體來說,如果將['out' generic modifier](http://msdn.microsoft.com/zh-cn/library/dd469487.aspx)添加到您的簽名'interface IForm where T:IField',那麼它將工作。但是這增加了其他限制/考慮因素,所以我不能評論它是否適用於您當前的設計/使用。 –
我很好奇你在用這個設計來完成什麼。 – sidesinger
非常感謝這兩個肛門,他們真的很好。我添加了一個編輯,解釋爲什麼我以這種方式設計瞭解決方案,但是這兩種方法都可以解決我的問題。問候。 – Sugar