2011-03-25 77 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