C#之抽象类、虚方法、重写、接口、密封类
前言
内容
- 抽象类不能直接实例化,必须由派生类实现。
- 抽象方法所在类必须为抽象类。
- 抽象方法中不包含方法主体,声明的方法为虚方法,必须由派生类以override(重写)实现此类方法。
- 抽象方法没有方法主体;
- 首先用virtual声明的虚方法可以被子类重写。
- 在派生类用override覆盖此方法;
- 不覆盖也可由对象调用;
- 有些方法无此关键字声明,在在派生类调用的时候要用new关键字隐藏原方法;
- abstract和virtual:方法重写的时候都要求用override进行重写;interface的方法和abstract方法都要求实现。
- 当对一个类应用sealed关键字的时候,这个修饰符会阻止其他类从该类继承,类似于Java中的final关键字;
- 在C#中的密封类是指该类不能被继承;
- 在密封类中的方法不能再次定义为密封的;
- 密封类不能用作基类,因此也能定义为抽象类,在运行调用时速度较快;
- 主要作用是防止派生;
实践
- <span style="font-size:24px;">//作者:阿童木子
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace 类关键字
- {
- class Program
- {
- static void Main(string[] args)
- {
- Teacher teacher=new Teacher() ;
- ITeacher itea = (ITeacher) teacher;
- itea.Eat();
- Console.ReadKey();
- Master master = new Master();
- master.Teach();
- }
- }
- //枚举
- // public enum sex { Male = "男", Famale = "女" }
- public enum Sex { Male = '男', Female = '女' }
- //结构体 StudentParams(params关键字表示类型一样,数量不详,是一个可变的方法参数)
- public struct StudentParams
- {
- public int ID;
- public string name;
- public string grade;
- public Sex sex;
- public string department;
- }
- //接口
- interface IPeople
- {
- string Name
- {
- set;
- get;
- }
- short Age
- {
- set;
- get;
- }
- Sex Sex
- {
- set;
- get;
- }
- void Eat();
- }
- //Teacher接口
- interface ITeacher:IPeople
- {
- void Teach();
- }
- //Student接口
- interface IStudent:IPeople
- {
- void Study();
- }
- //抽象基类
- abstract class People:IPeople
- {
- private string name;
- private short age;
- private Sex sex;
- public string Name
- {
- get
- {
- return name != null ? name : "zhoulitong";
- }
- set
- {
- if (value!="" )
- {
- name = value;
- }
- }
- }
- public Sex Sex
- {
- get
- {
- return sex;
- }
- set
- {
- value = sex;
- }
- }
- public short Age
- {
- get
- {
- return age > 0 ? age : (short)0;
- }
- set
- {
- if (value >=0)
- {
- age = value;
- }
- }
- }
- //虚方法
- public virtual void Eat()
- {
- Console.WriteLine("People eat.");
- }
- //抽象基类虚方法
- public abstract void Sleep();
- //{
- // Console.WriteLine("People sleep.");
- //}
- }
- class Teacher:People,ITeacher
- {
- //重写基类虚方法
- public override void Eat()
- {
- Console.WriteLine("Teacher eat.");
- }
- //重写抽象基类虚方法
- public override void Sleep()
- {
- Console.WriteLine("Teacher sleep.");
- //throw new NotImplementedException();
- }
- public void Teach()
- {
- Console.WriteLine("Teacher teach.");
- }
- }
- //定义一个密封类,防止派生;
- sealed class Master : Teacher
- {
- protected void Manage()
- {
- }
- }
- }</span>
这个例子体现在UML图中大致是这个样子的。
结语
C#之抽象类、虚方法、重写、接口、密封类的更多相关文章
- C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...
- C#虚方法、抽象类、方法重写
Timer.每隔一段时间触发一个事件.不可视控件.Interval.Enabled.Tick事件.计量单位:ms(毫秒). 1秒=1000毫秒.取当前时间 DateTime.Now.ToSt ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- 浅谈C#抽象方法、虚方法、接口
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
- C# 虚方法 抽象方法 接口
虚方法:virtu 注意的几点: 1,父类中如果有方法让子类重写,则可以将该方法标记为virtual 2.虚方法在父类中必须有实现,哪怕是空实现 3虚方法子类可以重写,也可以不重写 4.如果类是抽象类 ...
- C#中的抽象方法,虚方法,接口之间的对比
1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...
- C#之类的继承、抽象类和虚方法
代码下载地址 类的继承: 写电池的基类:包含条码和箱体码两个字段,含有两个参数的构造函数 class Battery { public string _barCode; public string _ ...
- C#通过虚方法实现方法重写—多态。
class Program { //希望person存的是哪个类的对象就调用哪个类的方法 //第一步 将父类中对应方法家virtual关键字 变为虚方法(子类可重写) //子类中方法用override ...
- 如何重写object虚方法
在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它.前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToStrin ...
- 【C#基础概念】虚方法virtual
目录: 一.虚方法的概念 二.虚方法的特点 三.虚方法的作用 四.虚方法的声明 五.虚方法的执行 六.虚拟类的规则 一.虚方法的概念 在C#中,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,则 ...
随机推荐
- Android repo 学习参考
/*************************************************************************** * Android repo 学习参考 * 说 ...
- Android Studio & Butter Knife —— 快速开发
Butter Knife是一个Android的注解框架,可以帮助用户快速完成视图.资源与对象的绑定,完成事件的监听.(也就是少写findViewById()) 具体的介绍可以参考官方主页: http: ...
- AAC_LC用LATM封装header信息解析 Audio Specific Config格式分析
通常来说AAC的头信息在编解码过程中是可以获取到的,但今天需要根据音频参数生成相应的AAC头.项目中使用的是AAC_LC,今天先对它的结构进行分析. 项目中使用ffmpeg进行音频编码,音频编码库为F ...
- CodeForces - 1019D(BZOJ3707圈地):Large Triangle (几何,找面积为S的三角形)
题意:给定平面上N个点,问是否存在三角形,其面积为S. 思路:选择Y轴,枚举这个Y轴,面积大小只与|y-Y|有关,然后二分,具体的可以先去做BZOJ3707. 具体的: 1,先对点排序,X坐标为第一关 ...
- HihoCoder1663双阶乘的末尾数字([Offer收割]编程练习赛40)(暴力||数学)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定正整数x和k,判断是否存在正整数1 ≤ y ≤ x使得x与y同奇偶且(x!!)/(y!!)的个位数字为k. 其中x!! ...
- HihoCoder1338 A Game(记忆化搜索)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a game. There is an integ ...
- Operating System-Thread(2) Multi-Process-Parallel vs Multi-Thread-Parallel
本文主要介绍线程的模型 一.Multi-Process-Parallel vs Multi-Thread-Parallel 多进程的并行:CPU在多个进程之间进行切换,系统给人一种多个进程在并行执行的 ...
- 使用Visual Studio进行单元测试-Part3
本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 测试覆盖率的统计 测试分组 测试Setup/TearDown 测试调试 Exception测试 代码覆盖率的统计 VS下面 ...
- Git 系列之tag的用法---为你的代码标记版本号
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 本地仓库操作 远程仓库操作 其他 tag 操作 在做app开发的时候经常有版本的概念,比如v1.0.v1.1之类的,不同 ...
- NSArray用法
//类方法初始化一个数组对象 [array count] : 得到这个数组对象的长度. [array objectAtIndex index]: 传入数组的索引(index) 得到数据对象. [arr ...