【发布时间】:2011-01-24 13:31:08
【问题描述】:
我有两个与接口相关的基本概念,我需要更好 对此事的认知。
1) 如果我只想使用接口的部分,如何使用接口 给定类中的方法?例如,我的 FriendlyCat 类继承自 Cat 并实现 ICatSounds。 ICatSounds 暴露了 MakeSoftPurr() 和 MakeLoudPurr() 和 MakePlayfulMeow()。但是,它也暴露了 MakeHiss() 和 MakeLowGrowl() - 我的 FriendlyCat 类不需要这两个。
当我尝试只实现接口公开的一些方法时 编译器抱怨其他人(我不需要)没有 实施的。
我必须创建一个只包含 我想公开的方法?例如,在我的 CatSounds 课程中,我 会创建 IFriendlyCatSounds 吗?如果这是真的,那么当 我想在另一种情况下使用其他方法?我需要创建吗 另一个定制的界面?这对我来说似乎不是好的设计。
看来我应该能够创建一个包含所有 相关方法 (ICatSounds),然后挑选我要使用的方法 我正在使用基于实现 (FriendlyCat)。
2) 我的第二个问题非常基本,但对于 我。当我实现接口(使用 Shift + Alt + F10)时,我得到了接口的 带有“throw new NotImplementedException();”的方法在身体里。什么 除了引用接口方法之外,我还需要做什么 我想在课堂上公开?我相信这是一个很大的概念性糟糕,但是 类似于从基类继承,我想访问这些方法 由界面公开,无需添加或更改它们。是什么 编译器希望我实现?
-- 编辑--
我现在了解#1,感谢您的回答。但我还需要进一步阐述 在#2。我最初的理解是,界面是一个完整的反映 给定类的设计方法。那是错的吗?所以,如果 ICatSounds 有 MakeSoftPurr() 和 MakeLoudPurr(),那么这两个函数都存在于 CatSounds 并按照他们的意思行事。那么这个:
public class FriendlyCat: Cat, ICatSounds
{
...
public void ICatSounds.MakeLoudPurr()
{
throw new NotImplementedException();
}
public void ICatSounds.MakeSoftPurr()
{
throw new NotImplementedException();
}
}
确实是已经存在的代码的反映,所以为什么 我执行什么?为什么我不能这样做:
FriendlyCat fcat = new FriendlyCat();
fcat.MakeSoftPurr();
如果答案是,正如我假设的那样,该方法没有 代码,因此什么也不做。然后,如果我想要这些方法 行为与接口所针对的类中的方法完全相同 被命名了,我该怎么办?
再次提前感谢...
【问题讨论】:
-
坦率地说,我会质疑 FriendlyCat 是否应该有一个“MakePurr”方法。我的回复有更多细节。如果我有什么不清楚的地方,我可以编写一个示例实现。