C#抽象方法与虚方法的区别实例

C# 接口 抽象类 虚方法 virtual方法和abstract方法以及C#接口的使用很容易混淆,现在来讨论一下三者的区别。前两者都牵涉到在派生类中与override的配合使用。 一、Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法... 阅读详情

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?
1. 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项;抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:
 

[c-sharp] view plain copy print ?

//抽象方法
public abstract class Animal
{
public abstract void Sleep();
public abstract void Eat();
}
//虚方法
public class Animal
{
public virtual void Sleep(){}
public virtual void Eat(){}
}



2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写;虚方法不是 也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:

[c-sharp] view plain copy print ?
  1. public class Animal  
  2. {  
  3. public abstract void Sleep();  
  4. public abstract void Eat();  
  5. }  

编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'

 

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。 抽象方法不能声明方法实体 而虚方法可以 包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化 !如:
 
[c-sharp] view plain copy print ?
  1. public abstract class Animal  
  2. {  
  3. public abstract void Sleep();  
  4. public abstract void Eat();  
  5. }  
  6.   
  7. public class Cat : Animal  
  8. {  
  9. public override void Sleep()  
  10. {  
  11. Console.WriteLine( "Cat is sleeping " );  
  12. }  
  13. // we need implement Animal.Eat() here   
  14. }  
编译器会报错:

  Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()'

  因为我们没有实现抽象类中所有抽象方法。

 

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现。并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类

抽象方法是虚拟方法的一种
抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为抽象方法。

只允许在抽象类中使用抽象方法声明
虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写。

IDEA 导入 jbolt项目(实验室非公开项目) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录准备一、准备数据库二、IDEA导入jbolt项目 准备 在实验室群文件中下载jbolt.zip和mysql.sql两个文件 将其解压到自己的目录下 一、准备数据库 打开Navicat新建一个jbolt数据库(字符集为utf8) 导入mysql.sql文件 数据库导入完毕 二、IDEA导入jbolt项目 点击打开一个项目 选择jbolt文件夹 以Maven形式打开 打开pom.xml 在里面添加jetty-server依赖 阅读详情

相关推荐

知识图谱的数据挖掘与分析

1. 背景介绍 1.1 数据挖掘的崛起 随着互联网的普及和大数据技术的发展,数据挖掘已经成为了计算机科学领域的热门研究方向。数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过计算机科学、统计学、信息论等多学科交叉的方法,挖掘出有用信息和知识的过程。数据挖掘的目标是从数据中发现有

AI天才研究院 1600

C sharp 抽象方法、类

抽象方法 抽象方法的关键词abstruct abstruct 返回值类型 (参数列表) 抽象方法必须要放在抽象类里面 抽象类里面既可以放抽象方法也可以放普通方法 抽象方法必须在子类中重写实现 除非子类也是一个抽象类,那么可以先不实现该抽象方法 ...

qq_24977805的博客 484

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 263

CSharp之虚方法(virtual)

虚方法是实现多态基本方法之一 虚方法通过virtual关键字修饰 虚方法在父类中必须有方法体,在继承类中可以重写(override),也可不重写 虚方法所在类可以被实例化 父类虚方法在派生类中通过base.fathermethod执行 ...

艾榕软件部落 1915

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 306

使用 FastAPI 构建高性能异步接口服务(含完整项目示例)

python复制编辑python复制编辑= 1: raise HTTPException(status_code=404, detail="用户不存在")特性FastAPI 支持情况类型注解✅自动文档✅异步支持✅ORM 集成✅(推荐 SQLModel)性能✅ 极高FastAPI 是你构建现代化、高性能 Python Web 应用的首选框架!

2501_92823525的博客 1302

C#中的多态,抽象类和虚方法的区别(abstract、virtual)

1、首先,解释一下什么叫多态。多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。2、在C#中、多态的实现有虚方法、抽象类和接口等。这里讲抽象类和虚方法。    假设我们有三个类,Base、Son、GrandSon类。Base类是抽象类,其中有抽象方法A和虚方法B。Son类是Base类的子类,GrandSon类是Son类...

weixin_38118900的博客 1648

Sigrity Power DC Single-BoardPackage IR Drop Analysis模式进行单板压降仿真分析操作指导

如果需要单独对某个via设置参数,右侧选择Setup by padstack,下方下拉选择某个via,单独设置参数即可。举例:板厚1.6mm,内层1OZ(1.2mil,即0.03mm),铜皮宽度1mm,20度温升,允许通流I为2.5A。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。电流密度计算公式:J=I/A(J为电流密度,I为电流,A为横截面积)

weixin_54787054的博客 697

抽象方法与虚方法的异同(以及抽象类和接口)

抽象方法与虚方法的异同(以及抽象类和接口) 1.抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写; 2.虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。 重写的子类虚函数就是被覆盖了。 3.抽象方法: 使用abstract关键字 public abstract bool Withdraw(…); 抽象方法是必须被派生类覆写的方法。 抽象...

weixin_43730142的博客 1392

JAX/JAXlib GPU 加速版本安装教程(CUDA)

本文介绍了在Windows WSL2+Ubuntu22.04环境下配置JAX/JAXlib GPU加速版本的详细步骤。使用RTX 4060显卡,安装CUDA 12.4和cuDNN 8.9.7驱动,通过Miniconda创建Python 3.9虚拟环境。具体步骤包括:安装Miniconda、配置CUDA环境变量、安装cuDNN驱动、下载并安装JAX/JAXlib。最后通过测试代码验证GPU加速功能,成功检测到GPU并完成矩阵运算。整个过程配有详细命令和截图说明,适合需要搭建JAX GPU开发环境的用户参考。

猿小白的博客 627

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 540

C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

1.抽象类可以有实现(包括构造函数),而接口不可以有任何实现。 namespace ConsoleApplication1 { class Program { interface IMyInterface1 { void IMethod1(); void IMethod2(); } abstract class AMyClass1 { public abstract void...

数据库天地 91

国科大学习资料--人工智能原理与算法-2021年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 根据学弟的反馈,该年的期末题只有5道,且均是作业题(所以大家一定要积极完成作业,考前多做几遍!!!!) 下面解析: 3.25 由于该题,我没有做过,所以只能给你英文版的答案。答案如下,其他的题目答案都是中文版。 5.9 8.10 12.20 15.13 ...

无名何许人的博客 3980

在c#中虚方法和抽象类的区别

在C#中,虚方法(virtual method)和抽象方法(abstract method)是面向对象编程中两种重要的机制,用于实现多态性。虽然它们都有助于实现类之间的灵活关系,但它们在定义、使用以及功能上有一些关键的区别。

二十多岁的你迷茫又着急,想要车子,想要房子,想要享受旅行,你那么浮躁,拿什么看透人生! 1052

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C#中虚方法和抽象方法的区别

定义抽象方法是使用abstract关键字修饰的方法,在基类中没有具体的实现。抽象方法必须在派生类中实现。实现抽象方法在基类中没有实现体,只有方法签名。派生类必须实现基类中的每一个抽象方法,否则派生类也必须声明为抽象类。实例化含有抽象方法的类本身不能被实例化,必须是抽象类。只有派生类实现了所有抽象方法后,派生类才可以被实例化。调用抽象方法没有自己的实现,它们必须在派生类中实现,所以调用是通过派生类的实例来实现的。// 错误:不能实例化抽象类。

Major_S的博客 812

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# 抽象类与接口的区别:4 个维度 + 代码示例详解

本文从实现方式、成员构成、继承规则和多继承支持四方面系统对比C#抽象类与接口,指出抽象类强调“是什么”的继承关系,支持方法实现与非公共成员;接口强调“能做什么”的能力契约,仅含公共声明。抽象类单继承,接口可多实现,适合解耦与扩展。建议:有共性实现用抽象类,定义行为契约用接口,实际开发中常结合使用。

德仔 1148

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

虚方法与抽象方法区别

虚方法是必须要实现的,只有接口或者抽象方法才没有实现体,什么是实现体,就是方法的那对大括号:下面举例: 虚方法是必须实现的,子类可以选择是否重写抽象方法一定没有实现,而且必须在抽象类中,子类中必须重写。应用举例:......

我是慎独玩家,无人见处,自有尺度! 228

C# 面试问题大全:027:虚方法(Virtual Methods)与抽象方法(Abstract Methods)有什么区别?

抽象方法是在抽象类中声明但没有具体实现的方法。抽象方法要求所有继承该抽象类的子类必须提供具体的实现。

caifox的博客 1102

虚方法,抽象类,多态性

Code1.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如://抽象方法publicabstractclassAnimal{publicabstractvoidSleep();publicabstractvoidEat();}//虚方法publicclassAnimal{p...

weixin_34177064的博客 316

C# 虚方法与抽象方法区别

虚方法是必须要实现的,只有接口或者抽象方法才没有实现体,什么是实现体,就是方法的那对大括号:下面举例:public abstract void Fn1();//定义一个抽象方法 publi...

dotNET跨平台 429

C#中的方法(二)

前言     前一篇博文为大家简要介绍了了C#中的基本方法--- C#中的方法(一)。本篇博文将为大家分享一些方法中的特殊方法内容— 虚方法、抽象方法、静态方法、实例方法。 正文 虚方法:     用virtual修饰的方法叫做虚方法。虚方法可以在子类中通过override关键字来重写。常见的虚方法:ToString()Equals。   ...

梦蝶 849

【c#】抽象方法与虚方法、abstract与virtual、抽象方法与隐藏方法、抽象类与接口

c#:抽象方法与虚方法、abstract与virtual、抽象方法与隐藏方法、抽象类与接口

hujunshuo的博客 1269

c#:浅析抽象方法与虚方法的区别

c#:浅析抽象方法与虚方法的区别 ​ 在c#中,abstract关键字修饰的方法 (抽象方法) 与 virtual关键字修饰的方法 (虚方法) 都可以供派生类来重写它们所在基类中所修饰的方法,那么它们之间有什么区别呢?,来让我们一起来看看他们的特点吧 GO! GO! GO! 一、abstract关键字 ​ 1、被abstract关键字修饰的方法被称为抽象方法 ​ 2、抽象方法所在的类必须为抽象类,但是抽象类中可以没有抽象方法 abstract class Animal//抽象动物类

abraham_ly的博客 586
上一篇: sql之left join、right join、inner join的区别
下一篇: "用户 'sa' 登录失败。原因: 该帐户被禁用"的解决方案
bbl_bbg
博客等级 码龄15年 3粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值