C#中的虚方法,抽象方法,抽象类以及接口

前言

众所周知,面向对象三大特点:封装、继承、多态。而今天我们将要学习的都是以多态为基础的,而什么是多态呢?举个不恰当的例子,比如你的对象,今天面对你是一副姿态,明天她给你戴绿帽子又是另一副模样(这个例子是从一个博主那看到的),你的对象还是同一个人,但是可以根据使用的对象来展现不一样的面貌,这,就是多态。简单来说:多态就是在继承的前提下,不同对象调用相同方法却表现出不同的行为。注:本次示例使用VS Code.

虚方法:virtual

虚方法存在于相对于需要实现多态的子类的父类当中,同时也是实现多态的最基本的方法。

具体语法:父类的方法,用virtual修饰,表示虚方法。继承它的子类,在内部用override进行重写。下面进行案例分析:

猫和狗都是动物,他们都会叫,但是叫声不一样。提取出相同的部分,即叫声,将叫声实现为多态。

新建父类:Animal,新建子类Cat、Dog,代码如下:

调用小猫重写的方法

调用小狗重写的方法

抽象方法和抽象类

抽象方法和抽象类的关键字都是:abstract

如果父类的方法很抽象,而且没有具体的do(做什么)即方法体,必须要子类进行重写才有实际意义的话,这种情况就需要用抽象方法了。

父类、子类及输出:

抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。比如我们可以在里面写上普通方法,有实现的虚方法或者没有实现的虚方法都可以。前面我们讲的虚方法,假如子类需要完成多态的表现,而父类的方法实际上也有实际意义,那父类可以选择实现,等需要子类重写的时候去重写实现调用,父类的方法暂时没有实际意义,也可以不用具体实现。所以,父类的虚方法可以实现(有方法体),也可以不实现(没有方法体)。而抽象方法必须通过子类的重写来实现。

抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。

注意:抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。

抽象类使用场景:

1.父类方法不知道如何去使用

2.父类没有默认实现,而且不需要实例化

总的来说:抽象方法和虚方法差不多,实现的功能都差不多。抽象方法必须要包含在抽象类当中,而抽象类中可以不全是抽象方法。抽象类保证了所有的抽象方法必须得到重写,而虚方法可以根据需要来选择是否进行重写。

接口:Interface

接口和抽象类差不多,区别在于,接口内包含的全部是未实现的方法。而且接口类和方法的关键词不需要再声明abstract,接口类的关键词,interface,一般定义接口名称,按照约定,我们会在名称前面加上一个I。例如下图的打印机接口。

里面有两个未实现的方法。下面定义一个惠普打印机实现类,继承自接口IPrinter

输出:

总结可以如下图:

欢迎关注公众号一起学习:dotNET学习天地

原文地址:https://www.cnblogs.com/xingxingzhou/p/11729064.html

时间: 2024-08-08 12:46:12

C#中的虚方法,抽象方法,抽象类以及接口的相关文章

C#z中的虚方法,抽象类

1.虚方法 我在这动物类中定义了一个虚方法 Dosth class Animal { public int Aid; public string Name; public void SetAid(int i) { Aid = i; } public void SetName(string s) { Name = s; } public virtual string Dosth() { return null; } } 然后定义了一个猫的类和狗的类  都继承于动物类 class Dog : Ani

多态—虚方法、抽象类、接口

修饰符:public : 公共的,引用命名空间即可随意访问,访问权限最高:private : 私有的,只有在声明它的类和结构中才可以访问,访问权限最低: Internal : 内部的,同一个程序集中所有的类都可以访问,程序集就是命名空间, 访问权限次最高,这个访问修饰符是默认的:Protected : 受保护的,只能在他自己和自己的子类中才能访问. --------------------------------------------------------------------------

C#中的虚方法和抽象方法(Thirteenth Day)

今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用. 理论: •用virtual修饰的方法叫做虚方法 •虚方法可以在子类中通过override关键字来重写 •常见的虚方法:ToString() Equals 实操: 定义一个People的父类,包括Name,Gender,Age,和一个PeoHi 的虚方法,定义两个子类Teacher,包括Year,Salary两个属性和一个PeoHi方法:子类Student,包括StadyNum和一个PeoHi方法. 定义子类Teacher(

在基类构造器中调用虚方法需谨慎

最近,在基类的构造函数中调用虚方法时,发现了一个问题.先把问题重现如下: class Program { static void Main(string[] args) { var c = new Chinese(18); Console.ReadKey(); } } public class People { public int Age { get; protected set; } protected People() { this.Say(); } public virtual void

避免在构造函数中调用虚方法(Do not call overridable methods in constructors)

CLR中说道,不要在构造函数中调用虚方法,原因是假如被实例化的类型重写了虚方法,就会执行派生类型对虚方法的实现.但在这个时候,尚未完成对继承层次结构中所有字段的初始化.所以,调用虚方法会导致不可预测的行为.归根结底,这是由于调虚方法时,直到运行时之前,都不会选择执行该方法的实际类型. 在MSDN中,也给我我们详细的提示和范例. https://msdn.microsoft.com/en-us/library/ms182331.aspx 那我们就亲手来测试一下,新建两个类,Perople类,Chi

基类中的虚方法到底有什么作用?

只有基类的方法加上关键字virtual后才可以被override,从而实现面向对象最重要的特征--多态性,即基类可以使用派生类的方法. C#中指出:普通的方法重载:指的是类中两个以上的方法(包括隐藏的,继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法.   而在派生类中重新定义此虚函数时要求的是:方法名称.返回值类型.参数表中的参数个数.类型.顺序都必须与基类中的虚函数完全一致. 简单一点说就是子类中override的方法能够覆盖积累中的

浅谈C# 多态的魅力(虚方法,抽象,接口实现)

浅谈C# 多态的魅力(虚方法,抽象,接口实现) 分类:             asp.net             C#              2014-02-08 11:29     786人阅读     评论(0)     收藏     举报 浅谈C# 多态的魅力(虚方法,抽象,接口实现) 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向

《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)

前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性.常用的设计模式,比如简单工厂设计模式,核心就是多态. 其实多态就是:允许将子类类型的指针赋值给父类类型的指针.也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果.在运行时,可以通过指向基类的指针,来调用实现派生类中的方

C# 多态(虚方法,抽象,接口实现)

浅谈C# 多态的魅力(虚方法,抽象,接口实现) 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性.常用的设计模式,比如简单工厂设计模式,核心就是多态. 其实多态就是:允许将子类类型的指针赋值给父类类型的指针.也就是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果.在运行时

浅谈 C# 多态的魅力 - 虚方法、抽象、接口实现

提前总结:需方法.抽象方法可以重写,子类继承父类,抽象方法没有方法体,不能实例化 前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象的魅力体现了出来,那就是多态,多态用的好,可以提高程序的扩展性.常用的设计模式,比如简单工厂设计模式,核心就是多态. 其实多态就是:允许将子类类型的指针赋值给父类类型的指针.也就是同一操作作用于不同的对象,可以有不同的