c#:类的继承中Abstract 、Virtual和Override的使用
2017-12-29 15:42
357 查看
public abstract class Person { private string name; public Person(string name) { this.name = name; } public abstract void speaking(); public virtual void eatting() { Console.WriteLine("Person is eatting..."); } public void sleeping() { Console.WriteLine("Person is sleeping..."); } } public class Child : Person { private int id; public Child(string name,int id) : base(name) { this.id = id; } public override void speaking() { Console.WriteLine("Child is speaking..."); } public override void eatting() { base.eatting(); Console.WriteLine("Child is eatting"); } public new void sleeping() { Console.WriteLine("Child is sleeping..."); } } public class Adult : Person { private int id; public Adult(string name,int id) : base(name) { this.id = id; } public override void speaking() { Console.WriteLine("Adult is speaking..."); } public override void eatting() { base.eatting(); Console.WriteLine("Adult is eatting"); } public new void sleeping() { Console.WriteLine("Adult is sleeping..."); } } public enum Sex { male = 0, remale = 1 } public class Man : Adult { private Sex sex; public Man(string name,int id,Sex sex):base(name,id) { this.sex = sex; } public override void speaking() { Console.WriteLine("Man is speaking..."); } public override void eatting() { base.eatting(); Console.WriteLine("Man is eatting"); } public new void sleeping() { Console.WriteLine("Man is sleeping"); } }
static void Main(string[] args) { Child child = new Child("child",001); child.speaking(); child.eatting(); child.sleeping(); Console.WriteLine("--------"); Adult adult = new Adult("Adult", 002); adult.speaking(); adult.eatting(); adult.sleeping(); Console.WriteLine("--------"); Person person = new Child("person", 003); person.speaking(); person.eatting(); person.sleeping(); Console.WriteLine("--------"); person = new Adult("person", 004); person.speaking(); person.eatting(); person.sleeping(); Console.WriteLine("--------"); Man man = new Man("Man",005,Sex.male); man.speaking(); man.eatting(); man.sleeping(); Console.WriteLine("--------"); adult = new Man("Man", 006, Sex.male); adult.speaking(); adult.eatting(); adult.sleeping(); Console.WriteLine("--------"); person = new Man("Man", 007, Sex.male); person.speaking(); person.eatting(); person.sleeping(); Console.WriteLine("--------"); Console.Read(); }
运行结果:
virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别。二者都牵涉到在派生类中与override的配合使用。一、Virtual方法(虚方法)
virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
Virtual
方法可在抽象类中声明,也可在非抽象类中声明。Virtual方法在基类中定义了,在派生类中可以不重写它,调用基类的方法。
二、Abstract方法(抽象方法)
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。
abstract方法必须在抽象类中声明。
Abstract类中不能包含static方法,无法调用static方法。
相关文章推荐
- C#中Abstract 、Virtual和Override的使用,类的继承
- c#中abstract、override、new、virtual、sealed使用和示例
- 转:C#继承之base,virtual,override,abstract,new,sealed关键字
- c#中abstract、override、new、virtual、sealed使用和示例
- c#中abstract、override、new、virtual、sealed使用
- c#中abstract、override、new、virtual、sealed使用和示例
- C#继承之base,virtual,override,abstract,new,sealed关键字
- C#继承中abstract、virtual、override和new
- c#中abstract、override、new、virtual、sealed使用和示例
- C#中Abstract 、Virtual和Override的使用
- c# 继承 和 关键字:abstract,const,override,readonly,static,virtual,base,this
- c#中abstract、override、new、virtual、sealed使用和示例
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
- C#继承之base,virtual,override,abstract,new,sealed关键字
- C#继承中virtual、override、new的使用
- C#中Abstract 、Virtual和Override的使用
- C#中的static,interface,virtual,abstract,override的用法
- c#中 接口成员为什么不能使用关键字static virtul override abstract
- new、abstract、virtual、override,sealed关键字区别和使用代码示例
- 【C#】override,Abstract,Virtual 介绍及区别