C# 不是说继承自接口的类必须实现接口中的所有方法嘛?

boot_black 2018-05-30 03:17:03
* 本人是搞单片机开发的,想学习搞搞简单的上位机。于是开始学习C#语言了。
* 总是感觉自己对接口的理解有些浑浑噩噩,希望有大神能够帮我点醒我。

问题1:不是说继承自接口的类必须实现接口中的所有方法嘛?
例如:Ilist接口中的Contains()方法在类中就没有实现啊?为什么程序还能编译通过。

问题2:为什么还要在类的内部定义接口变量?定义这个接口变量的作用是什么。

感谢各路大神路过指教!




...全文
4467 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员的键盘 2019-01-07
  • 打赏
  • 举报
回复
抽象类:
可以有抽象成员,可以有非抽象成员;
可以修改成员的可访问性;
有构造函数,有析构函数,不能被实例化;
如果有抽象成员,抽象子类可以不实现,非抽象子类必须实现所有抽象成员;
子类实现基类成员时,不能修改其可访问性,默认公开;

接口:
只有抽象成员;
不能修改成员可访问性,默认公开;
没有构造函数和析构函数,不能被实例化;
子类必须实现它的所有成员;
可以通过隐式或显式来实现,隐式实现成员的可访问性必须为公开,显示实现成员可访问性必须为私有(通过接口名.接口成员来命名),显示实现的成员只能通过接口类型来访问;

接口不是类

我的一点看法
正怒月神 2018-05-31
  • 打赏
  • 举报
回复
引用 13 楼 twotuli_software 的回复:
版主都回答错误了,什么叫抽象类可以不完全实现接口? 这代码就不是完整的代码好吗? 抽象类也必须实现接口的!!!!
不对,问题来了,你到底说的哪个版主。 我感觉你好像说的不是我。
正怒月神 2018-05-31
  • 打赏
  • 举报
回复
引用 13 楼 twotuli_software 的回复:
版主都回答错误了,什么叫抽象类可以不完全实现接口? 这代码就不是完整的代码好吗? 抽象类也必须实现接口的!!!!
我在上面已经说了。你可能没看仔细。 派生类可以实现一部分抽象类的抽象方法。但是这个派生类也必须是抽象类。 而且总会有一个最下面的派生类实现完全部的抽象方法 而且代码上的意思,也很明确了。抽象类A,完整的抽象了接口的所有方法。 但是抽象方法分为了2个类一同完成。
维秀斯丢丢 2018-05-31
  • 打赏
  • 举报
回复
维秀斯丢丢 2018-05-31
  • 打赏
  • 举报
回复
版主都回答错误了,什么叫抽象类可以不完全实现接口? 这代码就不是完整的代码好吗? 抽象类也必须实现接口的!!!!
123321... 2018-05-31
  • 打赏
  • 举报
回复
在接口类中,子类继承了父类,就要实现父类里的方法
t t y 2018-05-31
  • 打赏
  • 举报
回复
嘿嘿 你们说的我看不懂
维秀斯丢丢 2018-05-31
  • 打赏
  • 举报
回复
引用 17 楼 hanjun0612 的回复:
[quote=引用 13 楼 twotuli_software 的回复:] 版主都回答错误了,什么叫抽象类可以不完全实现接口? 这代码就不是完整的代码好吗? 抽象类也必须实现接口的!!!!
不对,问题来了,你到底说的哪个版主。 我感觉你好像说的不是我。[/quote] 不是你哦,是没有头像的那个啊 哈哈
boot_black 2018-05-31
  • 打赏
  • 举报
回复
引用 18 楼 xuzuning 的回复:
谁说没有实现的呢? https://referencesource.microsoft.com/#mscorlib/system/collections/collectionbase.cs,4e201fdc07f5f637 他是专门对 IList.Contains()方法的实现,所以并不会开列在 CollectionBase 的方法列表中 也就是说:CollectionBase 并没有 Contains() 方法,而 CollectionBase.List 属性有 Contains() 方法 但又通过索引器使得 CollectionBase 的每个成员都具有了 Contains() 方法
感谢版主指教,似乎稍微明白一些了。
boot_black 2018-05-31
  • 打赏
  • 举报
回复
引用 13 楼 twotuli_software 的回复:
版主都回答错误了,什么叫抽象类可以不完全实现接口? 这代码就不是完整的代码好吗? 抽象类也必须实现接口的!!!!
尽管我不是很懂,但仍然要感谢大神严谨的态度!
xuzuning 2018-05-31
  • 打赏
  • 举报
回复
谁说没有实现的呢?
https://referencesource.microsoft.com/#mscorlib/system/collections/collectionbase.cs,4e201fdc07f5f637

他是专门对 IList.Contains()方法的实现,所以并不会开列在 CollectionBase 的方法列表中
也就是说:CollectionBase 并没有 Contains() 方法,而 CollectionBase.List 属性有 Contains() 方法
但又通过索引器使得 CollectionBase 的每个成员都具有了 Contains() 方法
SoulRed 2018-05-30
  • 打赏
  • 举报
回复
你可以预览一下C#8的默认接口实现特性。。
boot_black 2018-05-30
  • 打赏
  • 举报
回复
引用 10 楼 hanjun0612 的回复:
楼主,你可能忽略了,类是可以不断继承的 。C:B , B:A 那么C就是 A的派生类的派生类。 这当中B可能就实现了许多的抽象方法。 派生类可以实现一部分抽象类的抽象方法。但是这个派生类也必须是抽象类。 而且总会有一个最下面的派生类实现完全部的抽象方法。 下面这个是例子。
//IT接口  
    public interface IT
    {
        void IT1();
        void IT2();
    }

    //IT接口,全部按照抽象的方式实现,相当于让子类实现
    public abstract class A : IT
    {
        public abstract void IT1();

        public abstract void IT2();

        public abstract void A1();
    }

    //B只实现一个IT1抽象方法
    public abstract class B : A
    {
        public override void IT1()
        {
            Console.WriteLine("B--IT1");
        }


    }

    //C需要实现剩下全部的抽象方法。
    public class C : B
    {

        public override void IT2()
        {
            Console.WriteLine("C--IT2");
        }

        public override void A1()
        {
            Console.WriteLine("C--A1");
        }

        
    }
感谢 正怒月神 版主指教! 我再理解理解。
正怒月神 2018-05-30
  • 打赏
  • 举报
回复
楼主,你可能忽略了,类是可以不断继承的 。C:B , B:A 那么C就是 A的派生类的派生类。 这当中B可能就实现了许多的抽象方法。 派生类可以实现一部分抽象类的抽象方法。但是这个派生类也必须是抽象类。 而且总会有一个最下面的派生类实现完全部的抽象方法。 下面这个是例子。
//IT接口  
    public interface IT
    {
        void IT1();
        void IT2();
    }

    //IT接口,全部按照抽象的方式实现,相当于让子类实现
    public abstract class A : IT
    {
        public abstract void IT1();

        public abstract void IT2();

        public abstract void A1();
    }

    //B只实现一个IT1抽象方法
    public abstract class B : A
    {
        public override void IT1()
        {
            Console.WriteLine("B--IT1");
        }


    }

    //C需要实现剩下全部的抽象方法。
    public class C : B
    {

        public override void IT2()
        {
            Console.WriteLine("C--IT2");
        }

        public override void A1()
        {
            Console.WriteLine("C--A1");
        }

        
    }
xuzuning 2018-05-30
  • 打赏
  • 举报
回复
你的截图是帮助,并不开列所有的方法,按规则实现的接口方法,一般都不开列在类方法的列表中
cheng2005 2018-05-30
  • 打赏
  • 举报
回复
接口可以显示实现,你看到的不是源代码。 https://msdn.microsoft.com/zh-cn/library/system.collections.collectionbase.aspx
threenewbee 2018-05-30
  • 打赏
  • 举报
回复
引用 4 楼 boot_black 的回复:
[quote=引用 1 楼 caozhy 的回复:] 抽象类不一定全部实现。派生类必须实现,但是派生类中如果某个方法在基类中实现过了,也可以不自己实现。
感谢版主悉心指教,不胜感激! 再次请教版主一个问题:当我创建一个继承自CollectionBase的一个类,该类并非虚类。但是我根本没有实现其中的方法,为什么编译还能通过? 难道是因为该CollectionBase类是系统类,该类在系统某个未知的地方已经被实现了(我根本没有看到任何方法的实现代码)?[/quote] 基类实现了。
本人QQ-554433626 2018-05-30
  • 打赏
  • 举报
回复
引用 5 楼 boot_black 的回复:
[quote=引用 4 楼 boot_black 的回复:] [quote=引用 1 楼 caozhy 的回复:] 抽象类不一定全部实现。派生类必须实现,但是派生类中如果某个方法在基类中实现过了,也可以不自己实现。
感谢版主悉心指教,不胜感激! 再次请教版主一个问题:当我创建一个继承自CollectionBase的一个类,该类并非虚类。但是我根本没有实现其中的方法,为什么编译还能通过? 难道是因为该CollectionBase类是系统类,该类在系统某个未知的地方已经被实现了(我根本没有看到任何方法的实现代码)?[/quote] [/quote] 抽象类不一定有抽象方法
boot_black 2018-05-30
  • 打赏
  • 举报
回复
引用 4 楼 boot_black 的回复:
[quote=引用 1 楼 caozhy 的回复:]
抽象类不一定全部实现。派生类必须实现,但是派生类中如果某个方法在基类中实现过了,也可以不自己实现。


感谢版主悉心指教,不胜感激!
再次请教版主一个问题:当我创建一个继承自CollectionBase的一个类,该类并非虚类。但是我根本没有实现其中的方法,为什么编译还能通过?
难道是因为该CollectionBase类是系统类,该类在系统某个未知的地方已经被实现了(我根本没有看到任何方法的实现代码)?[/quote]

boot_black 2018-05-30
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
抽象类不一定全部实现。派生类必须实现,但是派生类中如果某个方法在基类中实现过了,也可以不自己实现。
感谢版主悉心指教,不胜感激! 再次请教版主一个问题:当我创建一个继承自CollectionBase的一个类,该类并非虚类。但是我根本没有实现其中的方法,为什么编译还能通过? 难道是因为该CollectionBase类是系统类,该类在系统某个未知的地方已经被实现了(我根本没有看到任何方法的实现代码)?
加载更多回复(3)

111,114

社区成员

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

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

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