接口和抽象类

  1. 什么是接口?   接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现部分。C#中接口可以包含属性、方法、索引器和事件声明。当某个类实现(implement)某个接口时候,这个类必须实现接口中的所有方法和其他成员。接口不能实例化。
  2. 什么是抽象类?  抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。

  接口和抽象类的区别:

  1. 抽象类应主要用于关系密切的对象,是对具有相同特点的一类(族)事物的抽象,更加注重与这些事物的共同属性等。比如:猫(Cat)、狗(Dog)、鸟(Bird)等几类,就可以抽象为Animal抽象类,他们具有共同的特征比如嘴巴、眼睛、耳朵、脚等属性,也都有Eat吃东西的功能。Cat、Dog、Pig继承自Animal抽象类,也就具有这些属性。 因此抽象类强调的是一种IS-A的关系;为此我们可以有以下实现。
    View Code
     1 abstract class Animal
    2 {
    3 public abstract string Mouth { get; set; }
    4 public abstract string Eye { get; set; }
    5 public abstract string Ear { get; set; }
    6 public abstract void EatFoot();
    7 }
    8
    9 class Cat : Animal
    10 {
    11 public override string Mouth
    12 {
    13 get;
    14 set;
    15 }
    16
    17 public override string Eye
    18 {
    19 get;
    20 set;
    21 }
    22
    23 public override string Ear
    24 {
    25 get;
    26 set;
    27 }
    28
    29 public override void EatFoot()
    30 {
    31 Console.WriteLine("Eat Fish");
    32 }
    33 }
    34
    35 class Dog : Animal
    36 {
    37 public override string Mouth
    38 {
    39 get;
    40 set;
    41 }
    42
    43 public override string Eye
    44 {
    45 get;
    46 set;
    47 }
    48
    49 public override string Ear
    50 {
    51 get;
    52 set;
    53 }
    54
    55 public override void EatFoot()
    56 {
    57 Console.WriteLine("Eat Bone");
    58 }
    59 }
    60
    61 class Bird : Animal
    62 {
    63 public override string Mouth
    64 {
    65 get;
    66 set;
    67 }
    68
    69 public override string Eye
    70 {
    71 get;
    72 set;
    73 }
    74
    75 public override string Ear
    76 {
    77 get;
    78 set;
    79 }
    80
    81 public override void EatFoot()
    82 {
    83 Console.WriteLine("Eat worm");
    84 }
    85 }
  2. 接口主要是定义一种规范或者行为,为不相关的对象提供统一标准的功能。比如Bird鸟类会Fly,而飞机也会Fly,他们之前并不属于同一种抽象类型,但是都有Fly的功能。因此,我们可以定义一个IFly接口具有Fly的功能;然后飞机和Bird都实现这个接口。因此,接口是对功能、行为的抽象,更强调一种“Can do”的关系。
    View Code
     1  interface IFly
    2 {
    3 void Fly();
    4 }
    5
    6 class Plane : IFly
    7 {
    8 #region IFly 成员
    9
    10 public void Fly()
    11 {
    12 Console.WriteLine("Plane: I can fly with my iron wings");
    13 }
    14
    15 #endregion
    16 }
    17
    18 class Bird : Animal,IFly
    19 {
    20 public override string Mouth
    21 {
    22 get;
    23 set;
    24 }
    25
    26 public override string Eye
    27 {
    28 get;
    29 set;
    30 }
    31
    32 public override string Ear
    33 {
    34 get;
    35 set;
    36 }
    37
    38 public override void EatFoot()
    39 {
    40 Console.WriteLine("Eat worm");
    41 }
    42
    43 #region IFly 成员
    44
    45 public void Fly()
    46 {
    47 Console.WriteLine("Bird:I can fly with my two wings");
    48 }
    49
    50 #endregion
    51 }
    在设计接口时候,尽量将接口设计成功能单一的功能块,要避免引起接口污染。“接口不变”是应该考虑的重要因素。在由接口增加扩展功能时候,应该增加新的接口,而不是更改现有接口。 
如果您觉得本文对您有所帮助,请点一下"推荐"按钮,您的"推荐"将是我最大的写作动力!
作者:rpoplar
出处:http://www.cnblogs.com/rpoplar/
本文版权归作者【rpoplar】和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究其法律责任的权利。
原文地址:https://www.cnblogs.com/rpoplar/p/2434464.html