面向对象 — 接口深入研究

 

面向对象 接口深入研究

1、接口的定义

什么是接口?接口用来定义一组抽象的操作的集合,通常是一些抽象方法和属性。其实,接口简单的理解就是一样约定、一种软件协议,接口约定和协议继承它的类或者结构(在Web开发方面个人认为类比结构用的多,以下只讨论类Class)必须实现接口中定义的方法,索引器,事件和属性,这就是一种协议,或者叫约定。单就这方面看,接口是没有什么用的,我们不遵守这项协议也能进行开发。但是,由于C#本身只能实现单继承,所以设计者在设计的时候为了实现多继承,就赋予接口一种特殊而有重要的功能,通过接口实现多继承。

2、声明接口

声明接口的如法如下:

public interface ICar

{

     string Model

     {

            get;

            set;

      }

      void StratEngine(Page page);

}

注意:在C#接口中只能包括方法、属性、索引器、事件的声明。不允许声明成员上的修饰符,即使是public也不行,因为接口成员总是公有的,也不能声明为虚拟的和静态的,如果需要修饰符,最好让实现类来声明。

3、接口的实现

     接口中定义的方法需要在类中实现,这个过程称为接口的实现。

1.         一个类可以同时实现多个接口(多继承)。后面用“,”分割。若实现类,则类在前,接口在后。继承接口的任何非抽象类型都必须实现接口的所有成员。例如:

public class Car:ICar

{

private string _model;

public string Model

{

get { return _model; }

set { _model = value; }

}

public void StratEngine(Page page)

{

page.Response.Write("Strat Engine!");

}

}

2.        接口和类都可以继承多个接口,类可以继承一个基类,接口更不不能继承类。

3.         一个接口定义了一个只有抽象成员的引用类型。C#中一个接口实际上说做的,仅仅存在着方法的标志(就Web开发普遍应用而言),但是根本就没有执行代码,这就注定了接口不能实例化。也即不能实例化一个接口。只能实例化继承接口的类。

4.         接口可以作为一种引用类型使用。这样方便使用接口中定义的方法,但是执行的是实本接口的类中的方法。同时我们也就可以让它指向执行实现这个接口的任何类型的实例了(通过类型转换实现),比较灵活,但是也有个缺点,就是我们如果不执行接口中的方法,比如类中定义的方法,就要先把接口的引用转换成合适的类型了。

4、显示接口的实现

     1.如果类实现了两个接口,并且这两个接口具有相同成员(方法、属性)那么在类中实现接口的时候,两个接口都使用该成员作为他们的实现,如果功能不一样,这无疑是一种错误,为此,显示接口的实现就是为了解决这种问题的。例如:


Public interface IControl

{

    void Paint();

}

Public interface ISurface

{

    void Paint();

}


public class SampleClass : IControl, ISurface

{

    void IControl.Paint()

    {

        System.Console.WriteLine("IControl.Paint");

    }

    void ISurface.Paint()

    {

        System.Console.WriteLine("ISurface.Paint");

    }

}

     2.显式实现还用于解决两个接口分别声明具有相同名称的不同成员(如属性和方法)的情况。

共同的解决办法是在实现接口的时候在相同成员的前面加“接口名称+.”。用于标示实现的是那个接口中的成员。

5、接口中的索引器

索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数,接口索引器的访问器与类索引器的访问器具有以下方面的不同:

1.接口访问器不使用修饰符。

2.接口访问器没有体。


public interface ISomeInterface

{

    int this[int index]

    {

        get;

        set;

    }

}

class IndexerClass : ISomeInterface

{

    private int[] arr = new int[100];

    public int this[int index]

    {

        get

        {

            if (index < 0 || index >= 100)

            {

                return 0;

            }

            else

            {

                return arr[index];

            }

        }

        set

        {

            if (!(index < 0 || index >= 100))

            {

                arr[index] = value;

            }

        }

}

IndexerClass test = new IndexerClass();//此段为运用

test[2] = 4;

        test[5] = 32;

        for (int i = 0; i <= 10; i++)

        {

            System.Console.WriteLine("Element {0} = {1}", i, test[i]);

        }


6、接口中的事件

同样,也可以在接口中定义事件,然后在类中实现它。关于它的运用将会在事件和委托中讲到。

原文地址:https://www.cnblogs.com/Logen/p/1302786.html