2011-03-25 81 views
1

這可能(希望是?)是一個「業餘小時」類型的問題。 :)實現接口的錯誤

我是新接口等,並正確地做事,但我有一個MVC 3項目,引用C#庫項目。

在C#庫項目,我有以下代碼:

public interface IRepositoryAddable<T> 
    { 
     void Add(T entity); 
    } 

我重複這種對於其他類型庫的代碼,這樣我可以做的事情在我所有的資料庫更容易和標準。

例如,我有型 「ISkill」 的任何一個存儲庫:

public interface ISkillRepository : IRepositoryAddable<ISkill>, IRepositoryDeleteable<ISkill>, IRepositoryDeleteableByID<ISkill, int>, IRepositoryGettableByID<ISkill, int>, IRepositoryListable<ISkill>, IRepositorySavable<ISkill> 
{ } 

然後,在我的實際存儲庫,我有:

public class SkillRepository : ISkillRepository 
    { 
     public void Add(Skill skillToAdd) 
     { 
      return; 
     } 
} 

據我所知,這應該足以實現ISkillRepositoryListable接口。不過,我收到以下錯誤:

Error 5 'DakotaSkills.MVC.Models.Repository.SkillRepository' does not implement interface member 'DakotaSkills.Lib.Interfaces.Repository.IRepositoryAddable.Add(DakotaSkills.Lib.Interfaces.ISkill)' C:\Users\Sean\Projects\Web\DakotaSkills\src\DakotaSkills.MVC\Models\Repository\SkillRepository.cs 11 18 DakotaSkills.MVC

存儲庫其它接口方法都顯示爲正在實施罰款,我不太清楚我在做什麼錯。爲了記錄,我的「技能」類型實現了「ISkill」,並且我的實現沒有收到任何錯誤。

幫助?

謝謝!

+1

轉至SkillRepository類文件,右鍵單擊ISkillRepository接口名稱,並從上下文菜單中單擊「Implement Interface」。 Visual Studio將創建您需要的所有正確的方法簽名。 – goenning 2011-03-25 20:11:34

回答

4

你的添加不會接受其他一些也實現了ISkill的類。你需要接受一個技能,而不僅僅是技能。這也表明,你的Add的實現,如果它曾經做過任何事情,只能通過ISkill來完成,而不是通過調用你可能知道的其他Skill方法。

+0

公共類SkillRepository:ISkillRepository { 公共無效添加(ISkill skillToAdd) { 回報; } } – Paul 2011-03-25 20:10:53

+0

啊,我明白了,凱特。感謝您的完整解釋!當我以這種方式聽到時更有意義。 – SeanKilleen 2011-03-25 20:22:09

1

應該是:

public class SkillRepository : ISkillRepository 
{ 
    public void Add(ISkill skillToAdd) 
    { 
     return; 
    } 
} 
2

你定義的接口具有:

void Add(ISkill skillToAdd) 

但是,你正在實施

void Add(Skill skillToAdd) 

,這意味着它們不匹配。如果我有不同的ISkill實現,我不能使用您的SkillRepository

你要麼需要做SkillRepository工作,任何ISkill,或者改變你ISkillRepoistory接口用一個具體Skill作爲其類型參數。

+0

嗨馬克,謝謝!但是,如果我使用的技能來自於ISkill,那麼它不應該接受,因爲它知道技能來自於ISkill?我認爲這是我困惑的地方。我認爲自Skill實施ISkill後,你可以在ISkill的地方使用它。 – SeanKilleen 2011-03-25 20:14:29

+2

@goober - 你可以將一個技能傳給任何期待一個ISKill的技能,就像你可以傳遞一個像3的整數給一個帶浮點的函數一樣。但是編寫一個採用整數的函數不能滿足編寫一個需要浮點數的函數的要求。所有技能都是技能 - 有可能除了技能之外的一些完全不同的職業能夠實施ISkill,所以並非所有的技能都是技能。你知道你不會,但編譯器不會。 – 2011-03-25 20:21:48

1

技巧是一個更具體的類型比ISkill,所以我覺得你需要更改添加的實施接受ISkill,而不是技能:

public void Add(ISkill skillToAdd) 
    { 
     return; 
    } 
+0

嗨KOTJMF,感謝您的提示 - 但是,我從理論角度對此提出了一個問題 - 請參閱我對Mark的回答的評論。 – SeanKilleen 2011-03-25 20:15:24

-1

我需要看到您的通話網站,即呼叫代碼

但是這聽起來太複雜了。閱讀本文並進行思考http://ayende.com/Blog/archive/2011/03/24/the-wages-of-sin-hit-that-database-one-more-timehellip.aspx

+0

嗨,亞當,感謝您的意見,但我已經權衡了不同版本庫實施的利弊,這更多的是一個技術問題,而不是一個策略問題。雖然謝謝! – SeanKilleen 2011-03-25 20:13:08

+2

@jfar在某些時候,每個人都會犯錯或需要一點幫助,除了巨魔之外,你的評論的目的是什麼? – KOTJMF 2011-03-25 21:00:44

+1

這可能是一個技術性問題,但據我所見,這感覺太複雜了一個數量級。我無法想象一個情況,你需要知識庫上的六個接口。我也不太確定如何查詢架構被拒絕投票,嘿嘿。 – 2011-03-25 21:02:54