标签:
1、接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则
2、抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。
public class NormalPlayer
2 {
3 public int ID
4 {
5 get;
6 set;
7 }
8 public string FirstName
9 {
10 get;
11 set;
12 }
13 public string LastName
14 {
15 get;
16 set;
17 }
18 public decimal WeekSalary
19 {
20 get;
21 set;
22 }
23 public string GetFullName()
24 {
25 return this.FirstName + " " + this.LastName;
26 }
27 public decimal GetDaySalary()
28 {
29 return WeekSalary / 7;
30 }
31 }
32 public class SubPlayer
33 {
34 public int ID
35 {
36 get;
37 set;
38 }
39 public string FirstName
40 {
41 get;
42 set;
43 }
44 public string LastName
45 {
46 get;
47 set;
48 }
49 public decimal MonthSalary
50 {
51 get;
52 set;
53 }
54 public string GetFullName()
55 {
56 return this.FirstName + " " + this.LastName;
57 }
58 public decimal GetWeekSalary()
59 {
60 return MonthSalary / 4;
61 }
62 }
我们发现,NormalPlayer和SubPlayer有共同的属性和方法,当然也有不同的属性和方法。把2个类的共同部分抽象出一个基类。
1 public class BasePlayer 2 { 3 public int ID 4 { 5 get; 6 set; 7 } 8 public string FirstName 9 { 10 get; 11 set; 12 } 13 public string LastName 14 { 15 get; 16 set; 17 } 18 19 public string GetFullName() 20 { 21 return this.FirstName + " " + this.LastName; 22 } 23 }
然后让先前的2个类派生于这个基类。
1 public class NormalPlayer: BasePlayer 2 { 3 public decimal WeekSalary 4 { 5 get; 6 set; 7 } 8 public decimal GetDaySalary() 9 { 10 return WeekSalary / 7; 11 } 12 } 13 public class SubPlayer : BasePlayer 14 { 15 public decimal MonthSalary 16 { 17 get; 18 set; 19 } 20 public decimal GetWeekSalary() 21 { 22 return MonthSalary / 4; 23 } 24 }
接着,我们发现NormalPlayer和SubPlayer计算日薪和周薪的方法也可以抽象出来,作为虚方法放到基类中
public class BasePlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public virtual decimal GetSalary() { throw new NotImplementedException(); } }
在NormalPlayer和SubPlayer这2个派生类中,需要重写基类的虚方法
public class NormalPlayer: BasePlayer { public decimal WeekSalary { get; set; } //获取日薪 public override decimal GetSalary() { return WeekSalary / 7; } } public class SubPlayer : BasePlayer { public decimal MonthSalary { get; set; } //获取周薪 public override decimal GetSalary() { return MonthSalary / 4; } }
但在实际情况中,BasePlayer只是一个抽象出来的类,我们并不希望实例化这个类。这时候,就可以把BasePlayer设计为abstract抽象类。同时,在抽象类中,提供一个计算薪水的抽象方法。一旦在基类中声明了没有方法体的抽象方法,所有派生于这个抽象类的类必须实现或重写基类中的抽象方法。
查看源代码打印帮助
public abstract class BasePlayer { public int ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string GetFullName() { return this.FirstName + " " + this.LastName; } public abstract decimal GetSalary(); }
由此可见,当2个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类
理解:
1、抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。...
2、抽象类不能直接new对象,它只能被继承,而且单一继承。也就是说它把公共的东西抽象出来,子类可以调用父类的方法,也可以拓展自己的功能,就像子承父业一样。接口可以被多次继承,这是和抽象类的最大区别。也就是说接口是一个公共用品谁都可以拿来用的,不想抽象类,不是他的子类是不能调用的。希望对你有帮助
3、当描述一组方法的时候使用接口 当描述一个虚拟的物体的时候使用抽象类
标签:
原文地址:http://www.cnblogs.com/jsonhan/p/5809207.html