2009-07-06 122 views
1

我有一個繼承自IRepository<TObject>的IRepository接口。我也有一個從S QLRepository<TObject>繼承的SqlRepository類,它繼而實現IRepository<TObject>。爲什麼我不能實例化一個SqlRepository實例作爲IRepository?無法將通用類轉換爲通用接口,爲什麼?

public class MyObject : IObject { 
    ... 
} 

public interface IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public interface IRepository : IRepository<MyObject> { } 

public class SqlRepository<TObject> : IRepository<TObject> where TObject : IObject, new() { 
    ... 
} 

public class SqlRepository : SqlRepository<MyObject> { } 

public class Controller { 
    private IRepository _repository; 

    public Controller() { 
     _repository = new SqlRepository(); 
    } 
} 

的例子試圖分配一個新SqlRepository在Controller類_repository,用下面的錯誤消息,當上述失敗。

Argument '1': cannot convert from 'SqlRepository' to 'IRepository' 

繼承的基本原理有哪些我沒有把握,請幫忙。

+0

我解決了這個問題,讓SqlRespository實現IRepository(公共類SqlRepository:SqlRepository ,IRepository {}),這似乎有點多餘,但我想我理解了邏輯。 – kim3er 2009-07-06 20:09:33

回答

10

因爲IRepositoryIRepository<MyObject>而不是相反。

基本上:

SqlRepositorySqlRepository<MyObject>
其是IRepository<MyObject>
要完成這項工作,您應該繼承IRepository<TObject>IRepository或使SqlRepository實施IRepository取決於您的意圖。

此問題根本不是泛型特有的。假設:

interface IMovable { } 
interface IDrivable : IMovable { } 
class Ball : IMovable { } 

很明顯,Ball不是IDrivable,而這是一個IMovable

1

SqlRepository implements IRepository<T>而不是IRepository

0

我認爲你需要聲明它是這樣的:

private IRepository<MyObject> _repository; 
0

SqlRepository並不直接從IRepository繼承,它繼承IRepository<MyObject>

嘗試有SqlRepository直接從IRepository繼承。

0

您也可以繼承泛型類型。

公共類SqlObjectRepository:SqlRepository {...}

但我不認爲你可以做到這一點的飛行。它需要成爲對象定義的一部分。

相關問題