首先声明一个概念:抽象方法有对应的抽象类,虚方法绝对没有对应的虚类或虚拟类
关键词abstract(抽象)的修饰范围是:类,方法,属性,索引器或事件
关键词virtual(虚拟)的修饰范围是:方法,属性,索引器或事件
记得当时自己学习C# 的封装性和多态性的时候一直会被搞迷糊.
回想起当时迷糊的路线图是这样的(看.net SDK):
抽象类(清楚)-------à密封类(清楚)----à抽象方法(坚持清楚)---à虚方法(没坚持住,迷糊了)
当然中间也掺杂着继承,多态,Override,Overload等概念,越看越迷糊,后来理了一下思路,发现我们先搞清楚两个概念,一切都变得简单了,这两个概念就是:”抽象方法”,”虚方法”
首先声明一个概念:抽象方法有对应的抽象类,虚方法绝对没有对应的虚类或虚拟类
关键词abstract(抽象)的修饰范围是:类,方法,属性,索引器或事件
关键词virtual(虚拟)的修饰范围是:方法,属性,索引器或事件
好,下面我们来说两个的区别
虚方法:
概念:使用关键词Virtual创建的方法称为虚方法
用法:将关键词Virtual添加到方法的返回类型的前面
模样:public virtual void Method(int i) { }
特点:1.方法定义后面必须有“{}”,可以有实现体,也就是说“{}”里可以有实现体也可以没有。
2.可以定义在除密封类的所有类中。
3.虚方法在派生类中可以被重写也可以不被重写
抽象方法:
概念: 使用关键词abstract创建的方法称为抽象方法.
用法: 将关键字 abstract 添加到方法的返回类型的前面.
模样: public abstract void Method(int i);
特点: 1.(必须)没有实现体,方法定义后面是分号”;”
2.抽象方法必须定义在抽象类中
3.抽象方法在派生类中必须被重写
4.存在抽象方法的类必须定义成抽象类
我在特点的描述上用了很多 ”必须” 以澄清概念。
大家可以看到抽象方法比虚方法限制更多,所以有些人说抽象方法是一个特殊的虚方法。
概念说完了,下面我们来看一个实例:
public abstract class Employee //抽象类
1 public abstract class Employee //抽象类
2 {
3 private string _name; //员工姓名
4 private int _year; //员工工龄
5
6 public string Name
7 {
8 get { return _name; }
9 set { _name = value; }
10 }
11 public int Year
12 {
13 get { return _year; }
14 set { _year = value; }
15 }
16
17 public abstract string calculateSalary();//抽象方法 计算工资
18
19 public virtual string getDescription() //虚方法, 根据计算返回要显示的结果
20 {
21 return string.Format("{0} gets {1} yuan per month.\n",
22 _name,
23 calculateSalary());
24 }
25 }
public class Intern : Employee //实习生类,继承自抽象类Employee
1 public class Intern : Employee //实习生类,继承自抽象类Employee
2 {
3 public override string calculateSalary() //必须重写抽象方法 calculateSalary()
4 {
5 return "1500";
6 }
7 }
public class FullTimeEmployee : Employee //全职员工,继承自抽象类Employee
1 public class FullTimeEmployee : Employee //全职员工,继承自抽象类Employee
2 {
3 public override string calculateSalary() //必须重写抽象方法 calculateSalary()
4 {
5 return (3000 + (base.Year * 2000)).ToString();
6 }
7
8 public override string getDescription()//重写了虚方法
9 {
10 return string.Format("{0} is FullTimeEmployee,can get {1} yuan per month.",
11 base.Name,
12 calculateSalary());
13 }
14 }
好,接下来我们来调用.
调用
1 Intern intern = new Intern();
2 intern.Name = "Taran Chen";
3 intern.Year = 1;
4 label1.Text = intern.getDescription();
5
6 FullTimeEmployee fullTimeEmployee = new FullTimeEmployee();
7 fullTimeEmployee.Name = "Tom";
8 fullTimeEmployee.Year = 4;
9 label1.Text += fullTimeEmployee.getDescription();
结果我想大家都一直知道了.
Taran Chen gets 1500 yuan per month
Tom is FullTimeEmployee,can get 11000 yuan per month
好了,实例也说完了,希望对你有所帮助。