介绍一下这两种方法:
一、Virtual方法(虚方法)
virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
二、Abstract方法(抽象方法)
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。请务必将抽象方法放在抽象类中。派生类必须全部实现父类的方法。
这是我自己总结的他们的简单的区别:
抽象方法的使用:
父类:public abstract void SayHi();
子类:使用override重写
public override void SayHi()
{
Console.WriteLine("我的名字是: {0} ,年龄是{1},爱好有{2}",Name,Age,Hoddy);
}
在program里:
List<Person> lists = new List<Person>();
for (int i = 1; i <=5; i++)
{
Student stu = new Student("cmz" + i.ToString(), 20 + i, "爱好无");
lists.Add(stu);
Teacher tea = new Teacher("程沐喆" + i.ToString(), 30 + i, 5 + i);
lists.Add(tea);
}
for (int i = 0; i < lists.Count; i++)
{
(lists[i] as Person).SayHi();
}
Console.Read();
虚方法的使用:
1.在父类里写SayHi方法
private Genders gender;
public Genders Gender
{
get { return gender; }
set { gender = value; }
}
public virtual void SayHi()
{
string message;
string sex;
switch (this.gender)
{
case Genders.Female:
sex = "女士";
break;
case Genders.Male:
sex = "先生";
break;
default:
sex = "外星人";
break;
}
message = string.Format(
"大家好,我是 {0} {1}。我今年 {2} 岁了。!",
this.Name, sex, this.Age
);
MessageBox.Show(message);
}
2.在student里使用override重写:
override public void SayHi()
{
string message = string.Format(
"大家好,我是 {0} 同学,今年 {1} 岁了,我喜欢 {2}!",
base.Name, base.Age, this.hobby
);
MessageBox.Show(message);
}
原文地址:http://blog.51cto.com/13758648/2128592