我正在嘗試創建一個通用接口,這將允許我與數據庫進行交互的方法。我希望我的業務應用程序能夠實例化任何連接方法,並確保界面完全相同。使用另一個接口從接口實現通用方法
下面是我現在嘗試的簡化版本。
數據庫接口其中IElement
是定義表的另一個接口。
public interface IDatabase
{
void setItem(IElement task); //this works fine
List<T> listTasks<T>() where T : IElement; // this doesn't
}
IElement接口:
public interface IElement
{
int id { get; set; }
}
IElement的執行情況:
public class TaskElement: IElement
{
public int id { get; set; }
public string name {get; set; }
}
的了IDatabase實現:
public class SQLiteDb: IDatabase
{
public SqLiteDb(SQLiteConnection conn)
{
database = conn;
}
public void setItem(IElement task)
{
// works fine when passed a new TaskElement() which is an implementation of IElement.
database.Insert(task);
}
//it all goes off the rails here
public List<T> listItems<T>() where T : IElement
{
var returnList = new List<IElement>
foreach (var s in database.Table<TaskElement>())
{ returnList.Add(s); }
return returnList;
}
我已經嘗試了很多的變化上這一點,但每一個給我一個新的是起訴。例如,在這裏有兩個錯誤。
1)
的類型參數方法
'SQLiteDb.listTasks<T>()'
不能從使用推斷。嘗試明確指定類型參數。
2)
無法隱式轉換類型
'System.Collections.Generic.List<TaskElement>'
到'System.Collections.Generic.List<T>'
我試着改變使用顯式類型的方法,但也有過問題。如果我使用IElement
(我所有元素的通用接口),我無法返回TaskElement對象的列表(我的實現爲IElement
),因爲它與返回類型(List<IElement>
)不匹配,並且如果我將返回類型更改爲List<TaskElement>
I不再實現接口。
值得注意的是,如果我停止使用接口和泛型,我可以很容易地實現這一點,但這似乎是使用接口的理想情況。當另一個應用程序(如直接繼承)可能更好時,也許我試圖將很多東西塞進界面中?
問題
我怎麼能同時限制它可以返回到另一個接口的唯一實現的類型實現一個通用的返回值的接口。
您是否嘗試過'var returnList = new List();' –
只是爲了注意,看看您的TaskElement,因爲您正在實現一個接口,您必須使Id公開(因爲默認情況下,c#將其設置爲私有) – ams4fy
與你的問題沒有任何關係,但如果你剛剛啓動c#,你應該閱讀[編碼約定](https://msdn.microsoft.com/en-gb/library/ff926074.aspx)其他開發人員會感謝您! – Jamiec