与具体类比较
-
允许(但不要求)抽象类包含抽象成员。
-
抽象类不能被密封。
与接口比较
抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。
接口是引用类型的,和抽象类的相似之处有三点:
-
不能实例化;
-
包含未实现的方法声明;
抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上:
-
类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
-
抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
-
抽象类是对象的抽象,然而接口是一种行为规范。
实例:
1 #region 星探-美女 2 /// <summary> 3 /// 好身材美女 4 /// </summary> 5 public interface IGoodBodyGirl 6 { 7 /// <summary> 8 /// 好面孔 9 /// </summary> 10 void NiceFace(); 11 /// <summary> 12 /// 好身材 13 /// </summary> 14 void NiceFigure(); 15 } 16 /// <summary> 17 /// 好气质美女 18 /// </summary> 19 public interface IGreatTemperamentGirl 20 { 21 /// <summary> 22 /// 好气质 23 /// </summary> 24 void GreatTemperament(); 25 } 26 27 public interface IPettyGirl 28 { 29 /// <summary> 30 /// 好面孔 31 /// </summary> 32 void NiceFace(); 33 /// <summary> 34 /// 好身材 35 /// </summary> 36 void NiceFigure(); 37 /// <summary> 38 /// 好气质 39 /// </summary> 40 void GreatTemperament(); 41 } 42 43 public class PettyGirlNew : IPettyGirl 44 { 45 private string name { get; set; } 46 public PettyGirlNew(string name) 47 { 48 this.name = name; 49 } 50 public void GreatTemperament() 51 { 52 Console.WriteLine($"{this.name},很有气质!"); 53 } 54 55 public void NiceFace() 56 { 57 Console.WriteLine($"{this.name},脸蛋很漂亮!"); 58 } 59 60 public void NiceFigure() 61 { 62 Console.WriteLine($"{this.name},身材很棒!"); 63 } 64 } 65 66 public class PettyGirl : IGoodBodyGirl, IGreatTemperamentGirl 67 { 68 public string name { get; set; } 69 public PettyGirl(string name) 70 { 71 this.name = name; 72 } 73 public void GreatTemperament() 74 { 75 Console.WriteLine($"{this.name},很有气质!"); 76 } 77 78 public void NiceFace() 79 { 80 Console.WriteLine($"{this.name},脸蛋很漂亮!"); 81 } 82 83 public void NiceFigure() 84 { 85 Console.WriteLine($"{this.name},身材很棒!"); 86 } 87 } 88 89 public abstract class AbstractSearcher 90 { 91 public IPettyGirl pettyGirl { get; set; } 92 public AbstractSearcher(IPettyGirl pettyGirl) 93 { 94 this.pettyGirl = pettyGirl; 95 } 96 public abstract void Show(); 97 } 98 99 public class Searcher : AbstractSearcher 100 { 101 public Searcher(IPettyGirl pettyGirl) : base(pettyGirl) 102 { 103 } 104 public override void Show() 105 { 106 Console.WriteLine($"美女信息如下:"); 107 base.pettyGirl.NiceFace(); 108 base.pettyGirl.GreatTemperament(); 109 base.pettyGirl.NiceFigure(); 110 } 111 } 112 113 #endregion