`

C#学习笔记——接口

 
阅读更多

声明接口

接口声明不包含数据成员。

接口声明只能包含如下类型的静态成员函数:

    方法

    属性

    事件

    索引

函数成员的声明不能包含任何实现代码,而在每一个成员声明的主体后必须使用分号。

按照惯例,接口名称必须从I开始(比如ISaceable)。

 

接口的访问性和接口成员的访问性之间的区别:

接口声明可以有任何的访问修饰符public,protected,internal或private。

接口的成员是隐式public的,不允许有任何访问修饰符,包括public。

 

public interface IMyInterface2

{

    private int Methed1(int nVal1,long lVar2);    //错误,接口成员不允许访问修饰符。

}

 

实现接口

使用类和结构来实现接口。要实现接口必须:

在街垒列表中包括接口名称。

为每一个接口的成员提供实现。

 

class MyClass:IMyInterface1

{

    int DoStuff(int nVar1,long lVar2)

    {...}                                                           //实现代码

    double DoOtherStuff(string s,long x)

    {....}                                                           //实现代码

 

}

 

 

如果实现了接口,则它必须实现接口的所有成员。

如果类从基类继承并实现接口,基类列表中的基类名称必须放在任何接口之前。

 

class MyClass:MyBaseClass,IMyInterface1,IMyInterface2

{

   ...

}

 

 

 

 

接口是引用类型

接口不仅仅是类或结构要实现的成员列表。它是一个引用类型。

IMyInterface1 imy=new MyClass();         //多态

IMyInterface1 imy=(IMyInterface1)new MyClass();     //强转

 

接口和as运算符

as运算符与接口配合使用

如果尝试强制转换类对象引用为类未实现的接口的引用,强制转换操作会抛出一个异常。可以通过使用as运算符来避免这个问题:

    如果类实现了接口,表达式返回指向接口的引用。

    如果类没有实现接口,表达式返回null,而不抛出异常。

 

如下代码演示了as运算符的使用: a 被作为 ILiveBrith的引用 或 null 赋值给 b。 

ILiveBrith b=a as ILiveBirth;   

 

 

实现多个接口

类或结构可以实现任意数量的接口。

所以实现的接口必须列在基类列表中并以逗号分隔(如果有基类名称,则在其之后)。

 

 

 

实现具有重复成员的接口

由于类可以实现任意数量的接口,有可能两个或多个接口成员都有相同的签名和返回类型。

 

这种情况下,类可以实现单个成员来满足所有包含重复成员的接口。

 

 

 

多个接口的引用

MyClass ob=new MyClass();   

 

IMyInterface1 imy = ob;

IMyInterface2 imy = ob;

 

 

 

派生成员作为实现

实现接口的类可以从它的基类继承实现的代码。

interface IIfc1{ void PrintOut(string s);}

 

class MybaseClass

{

    public void PrintOut(string s)

    {

 

    }

 

}

 

class Derived:MyBaseClass,IIfc1

{

}

 

class Program{

    static void Main()

    {

        Derived d = new Derived();

        d.PrintOut("object.");

    }

 

}

 

 

 

显示接口成员实现

单个类可以实现多个接口需要的所有成员。也可以为每一个接口分离实现。这种情况下,可以创建显示接口成员实现。显示接口成员实现有如下特性:

与所有接口实现相似,它被类和结构用来实现接口。

它使用限定接口名称来声明,由接口名称和成员名称以及它们中间的点分隔符好构成。

interface IIfc1{ void PrintOut(string s);}

interface IIfc2{ void PrintOut(string s);}

class MyClass:IIfc1,IIfc2

{

    void IIfc1.PrintOut(string s)    //   限定接口名称  显示实现

    {...}

    void IIfc2.PrintOut(string s)    //   限定接口名称  显示实现

    {...}

}

 

访问显式接口成员实现

显示接口成员实现只可以通过指向接口的引用来访问。也就是说,其他类的成员都不可以直接访问它们。

 

 

class MyClass:IIfc1

{

    void IIfc1.PrintOut(string s)    //显式接口实现

    {

        Console.WriteLine("IIfc1");

    }

 

    public void Method1()

    {

        PrintOut("...");                       //编译错误

        this.PrintOut("...");                //编译错误

        ((IIfc1)this).PrintOut("...");    //调用方法

    }

}

 

 

接口可以继承接口

接口本身可以从一个或多个接口继承。

要知道某个接口继承其他接口,应在接口声明中把基接口以逗号分隔的列表形式放在接口名称的冒号之后。

interface IDaoIO:IDataRetrieve,IDataStore

{........}

与类不同,它只在基类列表只能有一个类名,而接口可以在基接口列表中有多个接口。

    列表中的接口本身可以有被继承的接口。

    结果接口包含它声明的所有接口和所有基接口。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics