加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么抽象类不能被实例化,什么是无法实例化的类的使用

发布时间:2020-12-15 19:46:26 所属栏目:百科 来源:网络整理
导读:我知道并阅读有关抽象类和接口的内容,但我从未理解的一点是,无法实例化的类的用法是什么. 我可以使用普通类和虚方法而不是抽象类吗? 当我实例化基类时会发生什么? 解决方法 当您在派生类之间共享一些常用功能时,通常使用抽象类.也就是说,您不能使用接口,因
我知道并阅读有关抽象类和接口的内容,但我从未理解的一点是,无法实例化的类的用法是什么.
我可以使用普通类和虚方法而不是抽象类吗?
当我实例化基类时会发生什么?

解决方法

当您在派生类之间共享一些常用功能时,通常使用抽象类.也就是说,您不能使用接口,因为您想提供一些默认功能.

看看System.IO.Stream课程.此类提供了一些常见的基本功能,但要求特定类型的流实现某些成员才能使其正常运行.这些成员也标记为abstract,它向编译器和运行时指示没有合适的基类实现.派生抽象类的非抽象类必须覆盖所有继承的抽象成员,就像实现接口的类必须实现接口上定义的所有成员一样.

在流示例中,Read()方法是抽象的,但ReadByte()方法不是 – 因为ReadByte()可以通过调用Read()来实现. (虽然不是最佳的,这就是ReadByte()是虚拟的原因,因此可以选择性地提供更有效的实现.)虚拟成员是不同的,因为它们确实有一个实现,但可以选择被覆盖.默认情况下,抽象成员没有实现,必须重写.

换句话说,抽象类上的方法可以使用类上的其他抽象成员,即使它们没有实现!这是因为需要派生的非抽象类来提供实现 – 保证在调用方法时存在实现.这类似于如何使用接口的成员,即使成员在接口上没有实现,因为它保证实现接口的对象必须实现其所有成员.

MemoryStreamFileStream这样的子类覆盖了形成具体类的所有抽象方法,并且它们可以被实例化.但是,您可以将它们存储在Stream引用变量中,并将它们视为通用的“黑盒子”流.这允许您声明一个接受Stream对象的方法,而您不必关心它实际上是什么类型的流.

Stream foo = new Stream();       // Invalid,Stream is abstract.
Stream foo = new MemoryStream(); // Valid.

所以,现在总结一下你在标题中提出的问题的答案.抽象类无法实例化,因为它可能包含抽象且没有实现的成员.抽象类的使用是双重的:首先,要进行子类化,并允许子类共享某些成员的公共实现,其次,允许通过对抽象类的引用来使用子类的任何对象的实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读