博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入浅出OOP(四): 多态和继承(抽象类)
阅读量:6262 次
发布时间:2019-06-22

本文共 2643 字,大约阅读时间需要 8 分钟。

hot3.png

在本文中,我们讨论OOP中的热点之一:抽象类。抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样。本文中我们会通过代码来实现抽象类,并一一进行解析。

Abstract Classes

在微软的MSDN中,对抽象类有如下的定义:

用abstract 关键字可定义抽象类,要求其子类必须实现抽象类的函数、属性等。抽象类不可被实例化。抽象类提供了统一的定义,用于其不同子类直接共享数据、函数。 抽象类也可定义抽象函数。

 

Abstract Classes实战

在Visual Studio中添加Console程序,并命名为“InheritanceAndPolymorphism”,添加ClassA.cs,添加抽象类ClassA。

复制代码

                Main(=

复制代码

编译报错:

Compile time error: Cannot create an instance of the abstract class or interface 'InheritanceAndPolymorphism.ClassA'

结论:无法用new关键字来实例化一个抽象类。

 

Abstract Class的非抽象函数

给抽象类ClassA添加一些非抽象函数的代码:

复制代码

                            Main(=

复制代码

 

编译,依然报错。 抽象类无论是否有抽象、非抽象函数,均无法通过new关键字来实例化。

 

Abstract Class作为基类

我们把抽象类作为基类,添加ClassB—使之继承自ClassA。

复制代码

                                       Main(=

复制代码

编译的结果:不再报错。

结论:一个类可以继承自abstract 修饰的抽象类,且可被new关键字初始化。

 

Abstract Class的非抽象函数声明

在ClassA中声明YYY函数--无函数体。

复制代码

                                        Main(=

复制代码

 

编译,结果报错:

Compile time error: 'InheritanceAndPolymorphism.ClassA.YYY()' must declare a body because it is not marked abstract, extern, or partial

 

结论是需要对YYY添加函数体,或者添加abstract的修饰符。

 

Abstract Class的抽象函数声明

在ClassA的YYY前,添加abstract修饰符。

复制代码

                                         Main(=

复制代码

 

编译结果,报错:

Compiler error: 'InheritanceAndPolymorphism.ClassB' does not implement inherited abstract member 'InheritanceAndPolymorphism.ClassA.YYY()'

结论:我们在abstract 类中声明了一个abstract 的函数,但是并未在其子类ClassB中实现其内容;当使用new关键字初始化ClassB的时候则会报错----无法使用new关键字初始化一个abstract类。

 

子类继承实现抽象函数

在子类中添加YYY的实现。

复制代码

                                          Main(=

复制代码

编译结果,报错:

Compile time error: 'InheritanceAndPolymorphism.ClassB' does not implement inherited abstract member 'InheritanceAndPolymorphism.ClassA.YYY()' Compile time warning: 'InheritanceAndPolymorphism.ClassB.YYY()' hides inherited member 'InheritanceAndPolymorphism.ClassA.YYY()'.

结论:要使得子类继承基类的YYY函数,需要用到override关键字,然后才可以用new关键字实例化ClassB。

 

非抽象类的抽象函数

我们再看看这些代码:

复制代码

                                          Main(=

复制代码

 

编译,结果报错:

Compiler error: 'InheritanceAndPolymorphism.ClassA.YYY()' is abstract but it is contained in non-abstract class 'InheritanceAndPolymorphism.ClassA'

结果分析:声明abstract的函数,必须同时声明类为abstract。

        abstract 的函数不能同时添加static或virtual关键字。

 

抽象基类函数

 

复制代码

                                           Main(=

复制代码

编译,结果报错:

Compile time error : Cannot call an abstract base member: 'InheritanceAndPolymorphism.ClassA.YYY()'

结果分析:ClassB中无法使用base调用基类的abstract函数--因为其不存在。

 

最后一个问题,可否在抽象类中添加sealed关键字,结果是不可以。

抽象类不能添加sealed、static类修饰符的。

 

结论

通过下面几点,归纳一下本文的结论。

  • 无法使用new来实例化abstract 抽象类

  • abstract 抽象类可以有子类,其子类实现抽象方法后,可被new实例化对象

  • 如声明了abstract 的函数,则必须声明abstract 的类

  • 当override抽象基类,无法修改基类函数的签名

  • abstract函数,无法同时添加static、virtual关键字

  • abstract 类无法被声明为sealed、static类

 

原文链接:

转载于:https://my.oschina.net/powertoolsteam/blog/411697

你可能感兴趣的文章
MATLAB模糊逻辑(2)
查看>>
linux 内核模块管理
查看>>
【每日一摩斯】-【序列】-续-RAC and Sequences (853652.1)
查看>>
把一个select查询结果插入到一个表(可选指定字段和值实例)
查看>>
使用windbg抓取崩溃文件和分析的过程
查看>>
ViewHolder模式超简洁写法
查看>>
项目管理学习笔记之三.绩效分析
查看>>
php十行代码将xml转成数组
查看>>
centos 7 执行 groupinstall报错
查看>>
Web开发入门
查看>>
Flex开发小结(1)如何使用AdvancedDataGrid
查看>>
AFNetworking 下载文件断点续传操作
查看>>
Jar mismatch! Fix your dependencies
查看>>
哀悼日, 网页变灰的实现
查看>>
php:检测用户当前浏览器是否为IE浏览器
查看>>
linux命令备份
查看>>
10个你可能不知道的JavaScript小技巧
查看>>
【ASP】文件上传
查看>>
集合类(数据结构图、集合图、集合之间的比较)
查看>>
hibernate _关联级别策略介绍
查看>>