抽象类和接口的异同及实例解析

与具体类比较

  1. 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
  2. 允许(但不要求)抽象类包含抽象成员。
  3. 抽象类不能被密封。

与接口比较

抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。
接口是引用类型的,和抽象类的相似之处有三点:
  1. 不能实例化;
  2. 包含未实现的方法声明;
  3. 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。
抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上:
  1. 类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
  2. 抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
  3. 抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(static final)。
  4. 抽象类是对象的抽象,然而接口是一种行为规范。

实例:

  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