您的位置:首页 > 编程语言 > C#

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方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: