C#基础系列 - 抽象类及其方法的学习

在C#中使用关键字 abstract 来定义抽象类和抽象方法。

不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们
的实例。

"一个包含一个或多个纯虚函数的类叫抽象类,抽象类不能被实例化,进一步
一个抽象类只能通过接口和作为其它类的基类使用."- C++ Programming Language by Stroustrup Chapter13.2


抽象类能够被用于类,方法,属性,索引器和事件,使用abstract 在一个类声明中表示该类倾向要作为其它类的基类
成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现。

abstract class ShapesClass{abstract public int Area();}class Square : ShapesClass{int x, y;// Not providing an Area method results// in a compile-time error.public override int Area(){return x * y;}}

 

例如,一个包含非抽象方法的抽象类:

    abstract class MyAbs{public void NonAbMethod(){Console.WriteLine("Non-Abstract Method");}}class MyClass : MyAbs{}class MyClient{public static void Main(){//MyAbs mb = new MyAbs();//not possible to create an instanceMyClass mc = new MyClass();mc.NonAbMethod(); // Displays 'Non-Abstract Method'
        }}

 


一个抽象类可以包含抽象和非抽象方法,当一个类继承于抽象类,那么这个派生类必须实现所有的
的基类抽象方法。

一个抽象方法是一个没有方法体的方法。

 

 abstract class MyAbs{public void NonAbMethod(){Console.WriteLine("Non-Abstract Method");}public abstract void AbMethod(); // An abstract method
    }class MyClass : MyAbs//must implement base class abstract methods
    {public override void AbMethod(){Console.WriteLine("Abstarct method");}}class MyClient{public static void Main(){MyClass mc = new MyClass();mc.NonAbMethod();mc.AbMethod();}}

 

 

 


但是通过声明派生类也为抽象,我们可以避免所有或特定的虚方法的实现,
这就是抽象类的部分实现。


 

abstract class MyAbs{public abstract void AbMethod1();public abstract void AbMethod2();}//not necessary to implement all abstract methods//partial implementation is possibleabstract class MyClass1 : MyAbs{public override void AbMethod1(){Console.WriteLine("Abstarct method #1");}}class MyClass : MyClass1{public override void AbMethod2(){Console.WriteLine("Abstarct method #2");}}class MyClient{public static void Main(){MyClass mc = new MyClass();mc.AbMethod1();mc.AbMethod2();}}

 

 

 

在C#中,一个抽象类能够继承另一个非抽象类,另外,继承了基类的方法,添加新的
抽象和非抽象方法是可行的。


 

class MyClass1 // Non-Abstract class
    {public void Method1(){Console.WriteLine("Method of a non-abstract class");}}abstract class MyAbs : MyClass1 // Inherits from an non-abstract class
    {public abstract void AbMethod1();}class MyClass : MyAbs//must implement base class abstract methods
    {public override void AbMethod1(){Console.WriteLine("Abstarct method #1 of MyClass");}}class MyClient{public static void Main(){MyClass mc = new MyClass();mc.Method1();mc.AbMethod1();}}

 

 

 

一个抽象类也能从一个接口来实现,这种情况,我们必须为所有的方法提供方法体,这些方法是来自接口

 

 interface IInterface{void Method1();}abstract class MyAbs : IInterface{public void Method1(){Console.WriteLine("Method implemented from the IInterface");}}class MyClass : MyAbs//must implement base class abstract method
    {}class MyClient{public static void Main(){MyClass mc = new MyClass();mc.Method1();}} 

 

 

 

我们不能把关键字abstract 和 sealed 一起用在C#中,因为一个密封类不能够被抽象

abstract class MyAbs{public abstract void AbMethod1();public abstract void AbMethod2();}class MyClass1 : MyAbs{public override void AbMethod1(){Console.WriteLine("Abstarct method #1 of MyClass1");}public override void AbMethod2(){Console.WriteLine("Abstarct method #2 of MyClass1");}}class MyClient{public static void Main(){MyAbs ma1 = new MyClass1();// Polymorphism
            ma1.AbMethod1();ma1.AbMethod2();}}

 

抽象方法有以下特征:

1.一个抽象方法可以看作是一个虚函数。

2.抽象方法的声明只能在抽象类中。

3.因为抽象方法声明只提供一个无实现的方式,没有方法体

4.方法体的实现被覆写方法提供,覆写方法是一个非抽象类的成员。

5.抽象属性的行为和抽象方法相像,除了不同的声明形式。

6.在一个静态属性中使用abstract 是一个错误。

        *一个抽象属性能够通过派生类使用 override 实现.

对于抽象类:

一个抽象类必须为所有的接口成员提供实现
一个用于实现接口的抽象类可能把接口方法安排到抽象方法上。例如

 

interface I 
{void M();
}
abstract class C: I 
{public abstract void M();
}

 

 

 

抽象类具有以下特征:

1.抽象类不能被实例化。

2.抽象类可以包含抽象方法和访问器

3.不能把抽象类用密封(sealed)来修饰,那就意味着类不能被继承,这违反抽象类被继承的原则。

4.一个派生于一个抽象类的非抽象类必须包括所有的继承来的抽象方法和访问器的实现

5.在方法和属性中使用abstract 关键字意味着包含它们的实现。

 

抽象类有时候和接口很容易混淆,因为抽象类除了不能多重集成,基本上可以替换接口,博主认为抽象类是为了解决代码的重复问题,而接口是为了实现多态,当考虑用接口还是抽象类的时候,考虑一下设计的时候是为了解决代码的重复问题还是为了实现多态。

 

转载于:https://www.cnblogs.com/gzskys/p/5599280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1977)vue之电商管理系统电商系统之按钮与文本框的切换

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

protobuf 数据解析的2种方法

方法1&#xff1a; message person{required int32 age 1;required int32 userid 2;optional string name 3;} message test{required int32 time 1;required int32 userid 2;required float price 3;optional string desc 4;} 1 #include <string>2 #include <…

前端学习(1978)vue之电商管理系统电商系统之为每一行数据提供单独的value

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

软工学习笔记——代码规范

上大学以来写了这几年的代码&#xff0c;却一直没怎么关注过代码规范相关的问题&#xff0c;直到软工课上讲了之后&#xff0c;才开始有所顾及。上课的时候回头看看自己写过的那些代码&#xff0c;真是丑死了&#xff0c;几个月前自己写的代码现在就已经读不懂了。 看了书上的相…

前端学习(1981)vue之电商管理系统电商系统之完成可选项的添加操作

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

ext4文件系统的delalloc选项造成单次写延迟增加的分析

最近我们的服务进程遇到kill -15后处于Z的状态&#xff0c;变为了僵尸进程&#xff0c;经过/proc/{thread_id}/stack查看其上线程的栈&#xff0c;发现是卡在了fwrite的过程中&#xff0c;而我们的系统中所有文件系统挂载参数都使用了delalloc参数&#xff0c;怀疑是这个原因&a…

前端学习(1982)vue之电商管理系统电商系统之删除参数的操作

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

前端学习(1983)vue之电商管理系统电商系统之清空表格数据

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

python 进程和线程

python中的进程、线程&#xff08;threading、multiprocessing、Queue、subprocess&#xff09; Python中的进程与线程 学习知识&#xff0c;我们不但要知其然&#xff0c;还是知其所以然。你做到了你就比别人NB。 我们先了解一下什么是进程和线程。 进程与线程的历史 我们都知…

NYU Hand Pose Dataset

http://cims.nyu.edu/~tompson/NYU_Hand_Pose_Dataset.htm#overview 转载于:https://www.cnblogs.com/guochen/p/5610681.html

前端学习(1984)vue之电商管理系统电商系统之完成静态属性

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

java实现文件在线预览

RequestMapping("/preview1") public void er(HttpServletResponse response){File file new File("G:\\桌面\\Thymeleaf3.0中文翻译文档www.java1234.com.pdf");if (file.exists()){byte[] data null;try {FileInputStream input new FileInputStream(…

Python 运维(三):使用 zipapp 将 Python 程序打包成单个可执行文件

大家好&#xff0c;我是水滴~~ 在 Python 开发中&#xff0c;我们经常需要将应用程序打包成可执行文件&#xff0c;以便在不具备 Python 环境的计算机上运行。Python 提供了多种打包工具&#xff0c;其中之一就是 zipapp。zipapp 可以将 Python 应用程序及其依赖打包成一个单独…

FreeMarker 集合遍历

freemarker list (长度,遍历,下标,嵌套,排序) 1. freemarker获取list的size &#xff1a; Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?size} 2. list的遍历&#xff1a; <#list animals as being> <tr> <td>${be…

java 返回文件的二进制字符串给前端

RequestMapping(value "/fileToStream", method RequestMethod.GET)ApiOperation("将文件转成流传给前端")public WebResponse fileToStream(HttpServletResponse response, HttpServletRequest request){ // // 自动判断下载文件类型 // response.set…

【BZOJ-3033】太鼓达人 欧拉图 + 暴搜

3033: 太鼓达人 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 204 Solved: 154[Submit][Status][Discuss]Description 七夕祭上&#xff0c;Vani牵着cl的手&#xff0c;在明亮的灯光和欢乐的气氛中愉快地穿行。这时&#xff0c;在前面忽然出现了一台太鼓达人机台&#xff…

ubuntu创建、删除文件及文件夹,强制清空回收站方法

mkdir 目录名 > 创建一个目录 rmdir 空目录名 > 删除一个空目录 rm 文件名 文件名 > 删除一个文件或多个文件 rm –rf 非空目录名 > 删除一个非空目录下的一切 touch 文件名 > 创建一个空文件 重命名文件&#xff08;夹&#xff09; / 移…

前端学习(1987)vue之电商管理系统电商系统之通过路由加载商品列表

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…