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#中,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,则 ...
随机推荐
- HTML5 学习记录——2
20150826 1.声明文档类型 <!DOCTYPE> 声明HTML是用什么版本写的. 常用声明; 2.HYML头部元素 <head> <title> 定义 ...
- PHP面试题,自己几斤几两,看看就知道了
0.简单做一下自我介绍,? 然后谈一下近三年来你的得意之作? 1.面试官看过你的简历,会问一些你做的项目的用户量.pv.吞吐量.相关难点和解决方法等 2.数据库设计经验,为什么进行分表? 分库? 一般 ...
- Java企业微信开发_05_消息推送之被动回复消息
一.本节要点 1.消息的加解密 微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip ,此包中封装好了AES加解密方法,直接调用方法即可. 其中,解 ...
- python的函数式编程知识小结
1.函数本身可以赋值给变量(即变量可以指向函数).而其实函数名本身就是指向函数的变量. 2.一个函数可以接受另一个函数作为参数.这种函数称为高阶函数. def add(a,b,f) return f( ...
- 把自定义的demuxer加入ffmpeg源码
.简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer 第一步: 在libavformat目录下新建mkdemuxer.c和mkdemuxer.h ...
- iOS中的日期和时间
转载于http://www.jianshu.com/p/ee279c175cf8 一.时间和日期计算 我们在应用开发中,时常需要和时间打交道,比如获取当前时间,获取两个时间点相隔的时间等等,在iOS开 ...
- VBA中的函数Timer用法
第1.40例 Timer 函数一.题目: 要求编写一段代码,运用 Timer 函数来计算本代码运行所化的时间.二.代码:Sub 示例_1_040() Dim t, i&, a t ...
- IntelliJ手记
1. 配置JDK:File - Project Structure - SDKs,点击“+”即可: 2. 配置远程调试,对于azkaban的远程调试,在azkaban-solo-start.sh里面的 ...
- 洛谷 4178 Tree——点分治
题目:https://www.luogu.org/problemnew/show/P4178 点分治.如果把每次的 dis 和 K-dis 都离散化,用树状数组找,是O(n*logn*logn),会T ...
- javascript中string的用法总结
javascript中很经常的会用到string类型的变量,对此,总结了几种常用操作或者方法:创建.拼接.子串.大小写转换.判断字符串相等.字符串查找等几种.下面将一一简单描述. 一.js中strin ...