zoukankan      html  css  js  c++  java
  • 抽象类和接口的异同及实例解析

    与具体类比较

    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
  • 相关阅读:
    PostgreSQL中的partition-wise join
    Partition-wise join
    外观模式 门面模式 Facade 结构型 设计模式(十三)
    桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
    组合模式 合成模式 COMPOSITE 结构型 设计模式(十一)
    创建型设计模式对比总结 设计模式(八)
    原型模式 prototype 创建型 设计模式(七)
    单例模式 创建型 设计模式(六)
    建造者模式 生成器模式 创建型 设计模式(五)
    抽象工厂模式 创建型 设计模式(四)
  • 原文地址:https://www.cnblogs.com/LandWind/p/10001064.html
Copyright © 2011-2022 走看看