抽象方法(abstract)、虚方法(virtual)及接口(interface)
抽象方法(abstract)、虚方法(virtual)及接口(interface)
抽象方法(abstract)
定义:abstract关键词标记的方法——抽象方法
特征:
- 抽象方法只能定义在抽象类里
- 没有方法体,只能通过子类重写实现功能
- 不能被所在的类直接调用,因为抽象类不能被实例化
- 抽象类的子类必须用override重写抽象类里的抽象方法(可以说抽象方法的目的就是为了重写)
- 抽象方法不能说private私有的(因为要被继承)
抽象类里可以拥有其他非抽象方法(普通方法、虚方法)
///抽象类
public abstract class AbsParent
{
///抽象方法
public abstract void AbsTest();
}
虚方法(virtual)
关键字virtual之后,会把方法定义为虚方法
特征:
- 可以定义在普通类或者抽象类里
- 子类不一定非要重写(因为它有方法体能实现功能了)
- 虚方法重写(派生)过的方法,还能继续(被子类的子类)派生(重写)
class A
{
public virtual void MethodA()
{
Console.WriteLine("Virtual Method A");
}
}
多层派生
///父类
public abstract class AbsParent
{
///抽象方法
public abstract void AbsTest();
}
//子类
public class AbsChild: AbsParent
{
public override void AbsTest()
{
//实现抽象类
//无法使用base.AbsTest()
}
}
//孙子类
public class AbsGroundSun : AbsChild
{
public override void AbsTest()
{
//这里可以使用base了,因为AbsChild已经实现了方法主体
base.AbsTest();
}
}
接口类(interface)
- 抽象类是单继承的,接口可以多继承
- 抽象类里面除了抽象方法,还可以写普通方法,虚方法,静态方法
- 接口只能写规范,不能写方法主体,也不能写别的方法
抽象类和接口的选择
功能侧重
抽象类:(父类只有一个) 继承+约束: 主要是继承,约束是副业 is a---抽象
类表述的对象。抽象类里可以没有抽象方法
接口: (接口可以多个) 只是做约束 can do,就可以跨不同类型 ----接口表
述的是行为,以及规则
选型
C#8.0后,接口允许有默认实现,会改变很多认知
选择还是以:
- 抽象类表述的对象
- 接口表述的是行为和规则
- 更多时候,选择接口就对了,除非有代码想复用(值得商榷)
抽象方法(abstract)、虚方法(virtual)及接口(interface)的更多相关文章
- 虚方法(virtual)和抽象方法(abstract)的和接口(interface)的区别
虚方法(virtual)和抽象方法(abstract)的区别 2017年06月15日 13:41:26 阅读数:65 注:本文转载自 http://www.cnblogs.com/michaelxu/ ...
- 虚方法virtual、抽象方法abstract、接口interface区别
接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样 ...
- 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系
1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...
- Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...
- C#中的抽象方法,虚方法,接口之间的对比
1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...
- C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件
一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...
- C#中抽象方法与虚方法的区别详解及示例
1. 抽象方法与虚方法的区别 先说两者最大的区别:抽象方法是需要子类去实现的.虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求.因为抽象类无法实例化,所以抽象方法没有办法被调用,也就 ...
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
- C#中抽象方法与虚方法的区别
一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People //声明一个抽象类 { ...
- C#中抽象方法与虚方法的区别(转)
C#中抽象方法与虚方法的区别 一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class Peo ...
随机推荐
- Luogu P9180 [COCI2022-2023#5] Slastičarnica 题解 [ 蓝 ] [ 区间 dp ] [ dp 状态优化 ] [ 前缀和优化 ]
Slastičarnica:非常好的区间 dp 题. 暴力 不难设计出暴力状态:\(dp_{q,i,j}\) 表示进行到第 \(q\) 次操作,剩下区间 \([i,j]\) 是否可行. 直到全部状态都 ...
- 2023LN省选游记
前言 CSP第一轮都考完了,我才写这个游记.我真懒惰 书接上回 正文 Day -114514 我也没想到我居然能报省选. 报上了.准备去爆零. Day -114513~Day -1 学习暴力算法以及痛 ...
- macOS Monterey(MacOS 12) 系统升级cocoapods
老款MacBook系统Monterey(MacOS 12)由于brew停止了从上游下载cocoapods提示不支持os12系统,无法安装最新版cocoapods,本文讲述了另一种方法来更新cocoap ...
- keycloak~关于社区认证的总结
keycloak关于社区认证它有统一的设计,社区认证包括了github,microsoft,wechat,qq,dingtalk等等,当然你还可以扩展很多实现了oauth2协议的第三方社区,将它们对接 ...
- 最优化算法Nesterov Momentum牛顿动量法
这是对之前的Momentum的一种改进,大概思路就是,先对参数进行估计,然后使用估计后的参数来计算误差 具体实现: 需要:学习速率 ϵ, 初始参数 θ, 初始速率v, 动量衰减参数α每步迭代过程:
- QT5笔记: 31. 文件目录操作
开发的时候,QtCreator F1 查看相关类的信息
- Ansible - [01] 入门&安装部署
自动化运维工具,可以批量远程其他主机并进行管理操作 一.什么是 Ansible Ansible首次发布于2012年,作者:Michael DeHaan,同时也是Cobbler的作者,Ansible于2 ...
- SG定理
先放一个 SG 函数的定义和 SG 定理 SG 函数: \(SG(p) = \text{mex}\ {SG(t)}\) SG 定理: \(\forall n\) 个独立的子图若 \(SG(1)\ \o ...
- win7系统安装mysql新建数据库/数据表及故障处理,安装mysql后net start mysql服务无法启动
问题描述:win7系统安装mysql,安装mysql后net start mysql服务无法启动 1.下载mysql: 官网地址:https://dev.mysql.com/downloads/mys ...
- 关于jsp的MySQL数据库连接问题
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...