目录

接口

1.接口 

1.1 声明接口

1.2 实现接口&调用接口

 1.2.1 显式接口实现方式

1.2.2 显式接口实现&隐式接口实现的使用场景

1.3 as运算符

2.接口继承接口


接口

1.接口

   接口的意义:C#的继承不支持一个子类拥有多个父类。而接口的存在就是为了弥补这一缺点,接口允许一个类拥有多个接口。正因有接口的存在,C#不仅有面向对象的编程,还有面向接口的编程。

  接口的定义:声明一组函数成员而不实现它们的引用类型。接口可以被继承,继承该接口的类或结构可以实现这些方法。

  创建接口的步骤:

  1. 第一步:新建项。右击解决方案,点击添加,新建项,然后创建一个新的控制台应用,并命名为CustomInterface
  2. 第二步:创建接口文件。右击CustomInterface项目,添加,新建项,选择接口。

1.1 声明接口

  声明接口的语法: 

  示例:

interface  IAdd
                                {
                                    int Add(int a,int b);//声明方法
                                }

    接口命名规范:接口名是前面要加一个大写的I。其含义是Interface的缩写,在编码时,方便我们知道它代表接口。

  使用接口的要求 :

  • 接口可以使用访问修饰符。
  • 在接口中定义的方法不需要添加修饰符,默认为public。
  • 接口可以只能包含非静态的方法、属性、事件、索引器。
  • 但不能包含静态成员、字段、运算符重载、实例构造函数、析构函数。
  • 接口中存放的是方法的声明,并没有存放方法的定义。接口的声明中分号代替了方法块
  • 值得注意的是,接口无法实例化。

1.2 实现接口&调用接口

  继承接口的语法: 

   实现接口的要求:

  • 必须实现接口中所有的成员
  • 基类列表有接口的名字

  示例:

internal interface IAdd
{
    //声明方法
    int Add(int a,int b);
}
public class Count:IAdd
{
    private int a=10;
    
    public int A
    {
        set{a=value;}
        get{return a;}
    }
    //隐式接口实现方法
    public int Add(int x,int y=10)
    {
        return x+y;
    } 
}

class Program
{
    static void Main(string[] args)
    {
        Count one = new Count();
        Console.WriteLine("两数相加和为{0}",one.Add(10));
    }
}

 1.2.1 显式接口实现方式

  显式接口的意义:解决一个类在继承不同接口时,接口中方法命名冲突的问腿。

  隐式接口实现方式:在实现接口方法的时候,没有明确指明实现哪个接口中的方法。(因为接口可以继承多个,不可避免有些接口的方法中标签和返回类型都相同,即方法名、参数)

  显式接口实现方式:明确指明是实现哪个接口中的方法。

  显式接口实现的语法:

                        返回类型  接口名.方法名(参数){...}

  使用显式接口的要求:

  • 显式实现的成员固定为是私有的。不能使用访问修饰符
  • 显式实现的成员不能被类对象访问。
  • 要访问显式实现的成员,需要将继承类的实例对象显式转换为对应的接口类型,并通过接口来调用成员。

 实例:

//接口的声明    
    internal interface IChinese
    {
        void SayHello();//声明方法
    }
    internal interface IAmerican
    {
        void SayHello();//声明方法
    }

    //接口的实现
    public class Speaker:IChinese, IAmerican 
    {
        //显式接口的实现
        void IChinese.SayHello() { Console.WriteLine("你好"); }
        void IAmerican.SayHello() { Console.WriteLine("Hello"); }
        //隐式接口的实现
        public void SayHello() { Console.WriteLine("你好丫hello"); }
    }
    
    //接口的调用
    class Program
    {
        static void Main(string[] args)
        {
            Speaker speaker = new Speaker();
            speaker.SayHello();
            //显式地转化为通过IAmerican接口来调用SayHello方法
            IAmerican american = (IAmerican)speaker;
            american.SayHello();

            IChinese chinese = (IChinese)speaker; 
            chinese.SayHello();
        }
    }

1.2.2 显式接口实现&隐式接口实现的使用场景

  • 采用隐式接口实现:类和接口都可以访问接口中的成员。
  • 实现单个接口
  • 采用显式接口实现:只能通过接口访问接口中的成员。
  • 实现多个接口。特别是接口中包含相同的标签和返回类型的情况。

1.3 as运算符

  as运算符的意义:通过显式接口的实现,我们知道可以通过强制转换类型来调用接口的方法。而as的存在,就是另一个更好调用接口成员的方法。我们

  as运算符的定义:可以通过as运算符来避免将类实例对象强制转换为未实现成员的接口类型时,报错的问题。

as运算符的语法:
                        接口名 变量名 =  类实例对象 as 接口名
示例:
                        IAdd        a      =       b            as   IAdd;

 as运算符的使用要求:

  • 如果类实现了接口,则返回指向接口的引用
  • 如果类没有实现接口,则返回null而不抛出异常。

2.接口继承接口

   接口继承接口的定义:接口不仅可以被类或结构继承,还可以被一个或多个接口继承。

接口继承接口的语法:
                                interface  接口:接口1,接口2...{...}

   接口继承接口的要求:

  • 派生接口拥有它本身成员和基接口的所有成员。