入行一年多,在这个IT行业,开发技术主要使用的是.NET,而对应使用的高级语言自然就是c#了。从2017年7月入职后,在平时的工作过程中,只记得使用一些方法去完成逻辑功能,而很少去深究一些语法特性,特别是没有去关注为什么会去使用这些语法。现在,入职一家新公司,那就从现在开始,一有空就做一些学习记录,同时这也是一种分享,希望在园子里可以和大家多多交流。

  平时在看项目代码的时候,经常看到Abstract这个关键字,但是我只是知道它该怎么用,却没有去关心为什么这么用。著名哲学家黑格尔曾经说过,“存在即合理。”而我们今天就一起来探讨一下Abstract(抽象)关键字的使用。

  在百度百科中,对于抽象类的解释如下:

  在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

c#中的抽象类的特征

抽象类具有以下特性:
  • 抽象类不能实例化。
  • 抽象类可以包含抽象方法和抽象访问器。
  • 不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。 采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
  • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

  那现在我们来实现它。首先,我们新建一个控制台程序用来实现抽象方法。

 

 然后新建一个抽象类:DoWork,注意,当一个类中有抽象方法的时候,这个类必须定义为抽象类。

  

  我们在类中定义两个抽象方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Learen_AbstractFunc
{
public abstract class DoWork
{
//定义一个抽象方法:奔跑
public abstract void DoRunnning(); //定义一个抽象方法:睡觉
public abstract void DoSleeping(); }
}

  

  然后定义一个类来继承这个抽象类,说明抽象类就是为了定义之后给别人继承的,而如果继承这个基类的派生类不想再抽象,就要去实现抽象类中的抽象方法。

  我们定义一个类,InheritDoWork.class 来继承原先的类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Learen_AbstractFunc
{
public class InheritDoWork : DoWork
{
public override void DoRunnning()
{
Console.WriteLine("实现了跑步的抽象方法");
Console.ReadKey();
} public override void DoSleeping()
{
Console.WriteLine("实现了睡觉的抽象方法");
Console.ReadKey();
}
}
}

  

  最后,我们在主程序program中来测试它。测试代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Learen_AbstractFunc
{
class Program
{
static void Main(string[] args)
{
//实例化一个对象,因为抽象类无法被实例化
InheritDoWork dowork = new InheritDoWork();
Console.WriteLine("现在开始执行。。。");
Console.ReadKey();
Console.WriteLine("现在开始跑步");
//调用已经实现的抽象方法
dowork.DoRunnning();
Console.WriteLine("现在开始睡觉");
//调用已经实现的睡觉抽象方法
dowork.DoSleeping();
}
}
}

  

  点击F5运行,执行结果如下。可以看到,我们在继承了抽象类后并且去实现了它。

  

  总结:看到这里你难免会觉得这样的想法真是多此一举,因为我们可以直接定义一个类就可以去实现它,但是如果有很多个类都要实现同样的方法呢?那么我们还哦要在每一个类中都定义一次这样类似的方法?这样显然不太合适,因此,我们使用抽象类就是为了一次定义,然后允许别的类来继承它,这样每一个类只需要去实现自己想要的功能,而不用每一次都要去定义一次。

 

c# 抽象类,抽象方法使用(abstract)的更多相关文章

  1. Java abstract关键字 抽象类 抽象方法

    用 abstract 修饰的类是抽象类,它不能生成对象 含有抽象方法的类称为抽象类 抽象方法使用 abstract 修饰 抽象类不能直接实例化,只能由子类实例化 举例 abstract class T ...

  2. 抽象类 抽象方法 abstract

    abstract: * abstract修饰类: 抽象类 * > 此类不能被实例化 * > 抽象类中一定要有构造器, 便于子类对象实例时调用(涉及子类对象实例化过程) * > 开发中 ...

  3. Java 学习(13):抽象类& 抽象方法& 封装

    目录 --- 抽象类 --- 封装 抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的 ...

  4. Java 抽象类 抽象方法 接口

    #抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化 ...

  5. Java 面向对象编程 抽象类 抽象方法 abstract

    抽象类 通过abstract定义的方法是抽象方法,它只有定义,没有实现.抽象方法定义了子类必须实现的接口规范: 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法: 如果 ...

  6. Java基础 -- Java 抽象类 抽象方法

    总结: 1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过.只有抽象类的非抽象子类可以创建对象. 2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类. ...

  7. 抽象方法(abstract)

    抽象方法:父类当中的方法,不确定如何进行 {} 方法体实现,那么这就是一个抽象方法 例如:动物类:叫{}    // 叫方法就是抽象方法,不确定以何种声音叫 格式: 抽象方法:加上 abstract ...

  8. Java 抽象类 抽象方法 使用说明

    知识点 什么是抽象类 抽象类与普通类主要两点不同: 1.在类的修饰符后面多了一个abstract关键字 2.抽象类是不允许通过new来实例化的 由于抽象类不能通过new来实例化,所以基本上是在继承中当 ...

  9. 接口和抽象类:Interface、abstract _【转】

    一.接口 接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方: 1.接口内部只能有函数.属性和事件的声明: interface IParent { void Show(); st ...

  10. python抽象类+抽象方法实现接口(interface)

    #python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ f ...

随机推荐

  1. DB2数据库操作XMl字段

    1.xml查询语句 ① 查询xml中的单个节点内容 select TM_PRM_OBJECT.ORG , TM_PRM_OBJECT.PARAM_CLASS , TM_PRM_OBJECT.PARAM ...

  2. 关于WebSocket需要知道

    WebSocket 概念 WebSocket是再单个TCP连接上进行双工通讯的协议,仅需要通过一次握手两个之间就可以创建持久性的连接,进行双向数据传输.WebSocket 是HTML5新增加的协议. ...

  3. Navicat:实现两个数据库结构同步和数据库对比

    Navicat版本:Navicat Premium 12 选择 工具 ——> 结构同步 ​ 选择源数据库和目标数据库,选择完成后点击右下角对比按钮 ​ 要修改的对象:源数据库和目标数据库中都有的 ...

  4. formidable处理node.js的post请求

    前言 我们都知道在node.js中,我们最常用的请求方式是get和post.其中get请求和URL相关,通过解析URL我们可以直接获取到请求的参数.但是post请求不同,post请求是包含在请求体中, ...

  5. Go:学习笔记兼吐槽(1)

      Go:学习笔记兼吐槽(1) Go:学习笔记兼吐槽(2) Go:学习笔记兼吐槽(3) 自动添加分号 在很多其他的编程语言中,每一行代码的结尾都必须有分号(假设一行中只有一句代码),Golang 的开 ...

  6. Android版数据结构与算法(一):基础简介

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 一.前言 项目进入收尾阶段,忙忙碌碌将近一个多月吧,还好,不算太难,就是麻烦点. 数据结构与算法这个系列早就想写了,一是梳理总结,顺便逼迫自己把一 ...

  7. php 通过header下载中文文件名 压缩包损坏或文件不存在的问题

    开发中大家都是使用的utf8编码,昨天遇到一个奇坑,本是一件很小的问题,解决也浪费了个吧小时.废话不多说,植入正题: 文件下载方式:通过header二进制流文件下载需求: 文件上传保留文件名不变数据字 ...

  8. TCP的三次握手与四次挥手

    TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...

  9. JDBC mysql 相关内容笔记

    解决乱码: url字符串加上?useUnicode=true&characterEncoding=utf-8; mysql数据库无法插入中文数据问题:将mysql数据库的编码改为utf-8; ...

  10. iTop软件功能分析以及优缺点比较

    iTop软件功能分析以及优缺点比较 iTop对标文档 1. 概述 2. CMDB 3. 主要功能模块 3.1 配置管理(Configuration Managment) 3.2 用户请求管理(Help ...