接口

接口

接口:

生活中,需要一些规范和标准,如汽车轮胎坏了,只需要更换同样规格的轮胎,一个支持USB接口的设备,如移动硬盘,手机,MP3,都可以插入计算机器的USB 中进行数据传输,

都是因为规范和标准

软件开发中由接口规定以系列的标准,继承同一接口的程序从而遵循了同一种规范,这样程序就可以相互替换,便于程序的扩展

接口时引用类型,接口定义一个协议,包含方法属性等成员,只描述成员的签名,不提供代码的实现,具体实现由接口继承类去实现,实现接口又必须遵守协议,按接口所规定的形式去实现

特点:
  1.一个类只能有一个基类
  2.接口中不能包含字段和const常量
 3.在接口中,可以存在方法,但是方法不能使用任何访问修饰符
 4.可以存在方法,但是方法不能有实现,只能有方法的声明
  5.接口不能直接的实例化对象,可以间接的实现
  6.接口中所有的成员,默认的访问级别都是public
 7.当一个类继承接口的时候,需要写出接口中声明的所有方法
  8.继承接口的类中写出与接口同名的方法,参数类型以及个数也必须与接口中相同
 9.接口更像是提供了一套规则,要求所有继承接口的类都必须遵守 制定通用的规则

10. 由于C#语言不支持多重继承(,类中只允许单继承),而接口支持多继承;

11.  父亲类其实是为了个子类提供公共的特征;接口,结构体,枚举,类,一个级别

12. class A:C(基类必须写在前面),I(接口1) ,l(接口2)

形式:

interface f{
   //【字段】
        //接口不能包字段和常量;
        //  public int age ;
        // public const int a=12;
     //【方法】
        //接口中存在方法,但是不能有访修饰符,接口中所有的成员默认级别都是public;
        //只能有方法声明,不能有方法实现;
        void Fly();
        //不能直接实例化对象,但可以间接实现;
        //所以没有  interface a = new intrface();这样的实例化;
       //【属性的声明】
        //和方法比较没有括号
        int age{
            get;
            set;
        }
    }

//  要求继承的方法
        // 1.访问修饰符,与接口中声明的方法级别相同  public
        // 2.要求方法的返回值类型,以及方法的名字必须相同 float
       // 3.参数类型必须相同,但参数名可以不同  float r  float s

interface IArea
    {
        float Area(float r); //public
    }

    interface IVolume
    {
        float Volume(float r);
    }

    class Ball:IArea,IVolume
    {

public float Area(float s)
        {       return (float)(4*Math.PI*s*s);
        }
        public float Volume(float r)
        {
            return (float)(4/3 * Math.PI * Math.Pow(r,3)); //Math.pow(a,3)------几次方的函数

        }
    }
 //1.接口继承接口;也必须实现所有的方法;
    interface aa{
        void r();
    }
    interface cc{
        void r();
    }
        interface  b:aa
    {  
        void r();

    }
    //2.1普通的类继承接口:必须实现接口中所有的成员方法;
    class c:aa
    {           public void r()
        {
            Console.WriteLine ("1");
        }
    }
    //2.2普通的类继承接口
    class e:aa,cc
    {  
    //同名了一个函数代表俩个方法了
        public void r()
        {
            Console.WriteLine ("1");
        }
        //当方法出现同名的时候
        //【显示实现】
        // 显式实现,通过  【接口.对象】  来调用
        // 当两个接口中,出现同名方法的时候,无法区分同名方法
        // 需要对其中一个接口中的方法使用显示实现
          //类。方法
        void  aa.r(){
            Console.WriteLine ("aa的接口继承");
        }
        void  cc.r(){

            Console.WriteLine ("cc的接口继承");
        }
    }
    //3.抽象类继承接口:

其实并不是必须实现他的方法,只不过是感觉是(不抽象只能实现);
  其实是要求:类中必须出现一个类中与他同名的方法;当一个类继承接口的时候,不

是必须要实现接口中所有的方法 而是,要求继承接口的类中必须出现与接口同名的方法
    abstract class d:aa
    {
        //解决方案1 (方法的实现)
        public void r()
        {
            Console.WriteLine ("2222");
        }
        //解决方案2 (方法的声明)
        public abstract void r();

    }
    //4.静态类不能继承接口,静态和接口是冲突的;
    static class axa:a
    {
        public void r(){
            Console.WriteLine ("3333");
        }
    }
}

【默认方法级别】
     //internal      enum        struct          class       interface    当前工程中,程序集
        //          {            {               {           {
     //成员       public       private         private          public且和枚举一样不能修改访问级别,类和结构体中的可以修改;
        //           }             }               }           }

【接口与抽象类】

联系:
      //1  用接口去强制的让所有遵守的人都谁去实现;抽象类中只有抽象方法必须去实现
     //2  接口与抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,
     //3两者都不直接实例化。
  区别:

1.概念上
      //1.接口中所有的方法都不能有实现,并且不能指定方法的修饰符
     //2.抽象类中可以有方法的实现,也可以指定方法的访问修饰符
      //3.【第一个】继承接口的【类】必须实现接口里的所有方法()

//4.C#只支持单继承,即子类只能继承一个父类,而一个子类却能够实现多个接口。

//5抽象类除拥有抽象成员之外,还可以拥有非抽象成员;而接口所有的成员都是抽象的。
      //6抽象成员可以是私有的,而接口的成员默认是公有的。

//7接口中不能含有构造函数、析构函数、静态成员和常量,-只能有方法和属性(也可以有事件和索引器的声明)

2.使用上

抽象类可以有实现,也可以没有实现,所以抽象类用来封装所有派生类的通用功能(即方法),接口是完全没有实现的,因此无法用来实现通用功能(作为基类),更多的是用类制定程序的开发规范,接口的实现代码是有开发者完成的,例如:有关xml文档的处理,有万维网联盟制定的一个DOM(文档对象模型)规范,具体的实现是由Microsoft Sun,等公司去实现的。