2010-10-06 128 views
10

我試圖在編寫我的應用程序時遇到的相當大(對我而言)的問題。 請看看這個(我會盡量縮短代碼的簡單性):C中的接口繼承#

我有根接口叫IRepository<T>。 接下來,IBookRepository : IRepository<Book> 接下來,具體的類實現它:BookRepository : IBookRepository

在RepositoryManager I類聲明private IRepository<IRepoItem> currentRepo;

IRepoItem是由圖書類實現的接口。

現在,當我嘗試做這樣的事情:

currentRepo = new BookRepository(); 

VisualStudio中給出的錯誤信息:

無法隱式轉換類型 'BookRepository' 到 'IRepository'。一個顯式轉換存在(是否缺少強制轉換?)

我想明確地投,但運行時拋出異常......

我知道(幾乎是肯定的),這是一種叫做協方差這可能(可能)在.Net 4.0中解決。 不幸的是,我正在使用框架版本3.5,我不能改變這一點。請給我一些建議做什麼 - 如何超越這個問題?我想從RepoFactory獲取currentRepo,這會根據用戶需求生成幾種類型的存儲庫。我不知道鏈接是否被允許在這裏,但我寫了一些博客http://olgatherer.wordpress.com/,我描述了應用程序創建。我的英語不好,但我希望能夠理解我。預先感謝您的回答。

最好的問候, skrzeczowas

+0

什麼是currentRepo聲明的類型? – 2010-10-06 13:35:11

+0

沒關係,我看到它是一個IRepository 。 – 2010-10-06 13:38:17

回答

4

在.NET 3.5的你絕對不能把一個IRepository<Book>IRepository<IRepoItem>

我們需要了解更多關於你在RepositoryManager中使用存儲庫的內容,才能真正知道如何解決它......但是,您可以創建IRepository<T>延伸的非通用IRepository接口嗎?使其包括所有不參考T的成員。然後,您可以聲明currentRepo僅作爲IRepository

+0

+1 - 我想過這個非泛型的'IRepository'接口,但不知道如何實現它。優秀的喬恩! =) – 2010-10-06 13:40:56

+0

再次嗨!我以這裏描述的方式創建了存儲庫:http://olgatherer.wordpress.com/2010/08/18/repositoriesrus/我創建了DbManager來管理數據庫併爲每個表(書籍,漫畫,後期郵票等)創建存儲庫)。現在我想DbManager中的currentRepository可能是BookRepository,StampsRepository,不管 - 我認爲這個接口的東西可以,但不幸的是,因爲IRepoItem(就像我現在意識到的)應該有所有不同的屬性,然後... :( – skrzeczowas 2010-10-07 06:33:44

0

在.NET 3.5中沒有.NET 4 IRepository和IRepository之間的任何關係,你可以做到這樣的事情與協變和逆變支持(但它取決於IRepository接口聲明)

A將推薦使用非通用的IRepository接口並自己進行轉換。我知道,這並不好,但你描述的功能需要協變/逆變支持。

+0

謝謝你這個答案,我用下面這一個,並意識到,這並不完全適合我:(我不知道該怎麼做現在... IRepoItem不能擁有所有的書籍,漫畫,郵票大小爲:( – skrzeczowas 2010-10-07 06:35:31

1

嘗試使用中間層(IRep):

interface IRepository<T> 
    { 
    } 

    interface IRep<T> : IRepository<IRepoItem> where T : IRepoItem 
    { 
    } 

    interface IBookRepository : IRep<Book> 
    { 
    } 

    class BookRepository : IBookRepository 
    { 
    } 

那麼你可以做你想做的:

 BookRepository br = new BookRepository(); 
     IRepository<IRepoItem> currentRepo = br; 
+0

嗨!這是非常棒的,非常高雅,我非常高興你發佈了這個。不幸的是,正如我在上面發表的評論中所描述的,我意識到這並不完全適合我.IRepoItem是一個可以在書籍,郵票,漫畫中實現的界面,這樣它就可以擁有不同項目的所有屬性,這並不聰明,我必須找到另一種方法來實現我想要的 - 這意味着我希望currentRepo是BookRepository或StampsRepository或任何其他倉庫...也許一些幫助,請嗎? – skrzeczowas 2010-10-07 06:38:44

+0

IRepoItem作爲其他東西的接口應該只會導致它鞏固它們共同的東西,而不是「所有屬性」。例如,IMoveable應該只顯示Move方法,並不是所有類派生的東西(如Cheetah,Car,Airplane)都有。 – Grozz 2010-10-07 06:45:52

+0

但是,如果我說,將有currentRepo = StampsRepo(),我將只能使用IRepository組成的方法。我將無法使用IStampsRepository方法:(我相信我可以再問一下這個currentRepo是什麼類型的:if(currentRepo是IBookRepository)如果(currentRepo是IStampsRepository)做一些其他的事情......但這不是好的對象編程,我認爲,我必須重新考慮我所做的所有假設,因爲也許我想要的是愚蠢的並且不可實現...... – skrzeczowas 2010-10-07 07:10:06