C# 接口疑问?

忆水思寒 2019-02-14 11:34:41
搜索 C# 接口和继承的问题 时 看到论坛里有人发的帖子
https://bbs.csdn.net/topics/392388638
大多数人的解答基本看懂了,只是#18楼的 xuzuning 回答下的那句
1 "但又通过索引器使得 CollectionBase 的每个成员都具有了 Contains() 方法",看了半天不懂,我理解字面意思是 CollectionBase.List在定义属性时实现了 Contains() 方法,但为什么实现这个方法后,通过索引器使得CollectionBase 的每个成员都具有了 Contains() 方法?
2 我看了给出连接处的CollectionBase 源码的实现方法为什么和通过 vs F12 查看到的原型不一样

3 为什么 用 vs F12 看CollectionBase 原型时,继承了那么多接口,我看了Ilist后面是继承了后面ICollection, IEnumerable两个接口的,CollectionBase 为何不直接继承Ilist,像源代码中的那样,为何还多写了后面两个接口
4 为什么 CollectionBase 实现了 Ilist接口中方法后不标识 public显示,那样不是可以用到更多功能了吗,再说它继承了Ilist后不就是使得CollectionBase 必须要有Ilist接口中的方法的,为什么实现后还要隐藏不能被调用,这样的用意何在.

刚学C#不久,有很多不熟悉的,可能描述有些很基础的东西不知道,望看到了大哥指正下,还有解答下上述疑问,谢谢了
...全文
293 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
忆水思寒 2019-02-17
  • 打赏
  • 举报
回复
引用
忆水思寒
测试下是否收到消息
忆水思寒 2019-02-14
  • 打赏
  • 举报
回复
感谢 圣殿骑士18 解答,现在明白了
圣殿骑士18 2019-02-14
  • 打赏
  • 举报
回复
1、版主可能写错了。不是“索引器”,而是“属性”。即:通过属性使得CollectionBase 的每个实例都“具有”了 Contains() 方法。
这个属性就是:
protected IList List {
get { return (IList)this; }
}


而我说的“具有”是打引号的,也就是说,可以通过List.Contains()来调用,从而间接的具有了Contains方法。

2、因为IList继承了ICollection,ICollection继承了IEnumerable。所以写不写后面两个,没差别。写了只是作为“帮助文档”,让你更清晰的知道,这个类是可以实例化为三个不同的接口的,是帮助层面的人性化。

3、同2

4、“为什么 CollectionBase 实现了 Ilist接口中方法后不标识 public显示”,你自己尝试一下就会发现,是不能加public。这里有个“显式接口”和“隐式接口”的概念。你可以再深入的了解下。使用显式接口,隐藏相关的接口方法,就是因为设计者想隐藏这个接口,他认为这个接口没有必要开放。

最后,贴一下我的测试:

public interface Interface1
{
void Test1();

void Test2();
}



public class Class2 : Interface1
{
private Interface1 t2
{
get { return (Interface1)this; }
}
public void Test1()
{

}

void Interface1.Test2()
{

}

public void My()
{
this.t2.Test2(); //调用Test2方式1
((Interface1)this).Test2(); //调用Test2方式2
}
}



Class2 c2 = new Class2();
c2.Test1();
Interface1 c3 = new Class2();
c3.Test2();


==========
欢迎关注微信公众号 “产品技术知与行” ,打造专业知识库,包括免费课程(C#,Java,Js)、技术专题、视野知识、源码下载等内容。


110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧