码迷,mamicode.com
首页 > Windows程序 > 详细

C#学习(二):接口

时间:2017-09-07 21:21:20      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:通过   c#   this   参考   重复   成员函数   function   签名   str   

什么是接口?

  接口,是指定一组函数成员而不实现它们的引用类型(所以只能用类和结构来实现接口)。

 

接口的声明

声明一个接口的语法如下(按照标准来说,接口名称从大写的‘I‘开始):

1 interface IinterfaceName
2 {
3     /*成员函数
4     func1(...);
5     func2(...);
6     .....
7     */
8 }

 

值得注意的几点:

1)接口声明不能包含数据成员静态成员。非静态成员只能包含方法属性事件索引器

2)接口的声明可以有任何的访问修饰符,如public、private等。但是,接口内的成员是隐式的public,而且接口内的成员不能显式地指明任何访问修饰符。

 

接口的实现

实现一个接口的语法如下:

 1 //声明接口
 2 interface IPrint
 3 {
 4    void printMessage(string msg);//接口中不实现方法
 5 }
 6 
 7 //实现接口的类
 8 class MyClass: IPrint
 9 {
10    //类自带的方法
11    void MyFunc()
12    {
13        Console.WriteLine("This is my own function.");  
14    }
15    
16    //实现接口的方法
17    void printMessage(string msg)
18   {
19      Console.WriteLine("Message is : {0}",msg);
20   }
21 }
22 
23 class Program
24 {
25   static void Main()
26   {
27      MyClass mc = new MyClass();
28      mc.printMessage("I implemented an interface");
29   }
30 }

我们也可以通过接口的引用来调用实现方法,语法如下:

 IPrint iprt = (IPrint)mc; //将类对象的引用转换为接口类型的引用
 iprt.printMessage("Print a msg."); //调用引用方法

或者使用as运算符(如果转换失败as运算符会返回一个null的引用):

 IPrint p = mc as IPrint; //使用as转换
 if(p != null) //别忘了判断p的引用是否为空
   p.printMessage("Some msg."); 

注:如果一个类从基类中继承并实现了接口,则该类的基类列表中的基类名称必须在所有接口之前。

 

类可以实现多个接口

类可以实现多个接口的方法,而且如果一些接口有相同签名相同返回类型的成员,那么类可以实现单个成员来满足所有包含重复成员的接口,代码如下:

 

interface IIfc1
{
  void PrintOut(string s);
}
 
interface IIfc2
{
  void PrintOut(string t);
}
 
class MyClass2:IIfc1,IIfc2
{
   public void PrintOut(string s)   //两个接口的单一实现
   {
      Console.WriteLine("This is a msg: {0}",s);
   }
}

当然,在某些情况下,可能会需要对每一个接口都有单独的实现,这时候可以指定显式的接口成员。

class MyClass2:IIfc1,IIfc2
{
   public void IIfc1.PrintOut(string s)   //IIfc1显式接口成员的实现
   {
      Console.WriteLine("This is a IIfc1‘s msg: {0}",s);
   }

   public void IIfc2.PrintOut(string s)   //IIfc2显式接口成员的实现
   {
      Console.WriteLine("This is a IIfc2‘s msg: {0}",s);
   }
}


//然后在Main方法中调用
class Program
{
   static void Main()
   {
      MyClass2 mc2 = new MyClass2();
      IIfc1 ifc1 = (IIfc1)mc2;
      ifc1.PrintOut("interface 1");

      IIfc2 ifc2 = (IIfc2)mc2;
      ifc2.PrintOut("interface 1");
   }
}

需要注意的是,同一个类中,其他的成员不能够直接地访问显式接口成员:

class MyClass3:IIfc1
{
   void IIfc1.PrintOut(string s)
   {
      Console.WriteLine("IIfc1: {0}" , s);
   }
 
   void MyFunc()
   {
      PrintOut("Fail.");           //编译错误,失败
      this.PrintOut("Fail.");    //编译错误,失败

      ((IIfc1)this).PrintOut("Success.");   //成功调用方法
   }
}

 

派生成员作为实现

实现接口的类可以继承基类中实现的代码,即使派生类不包含任何成员:

interface IIfc1
{
   void PrintOut(string s);
}

class BaseClass:IIfc1          //基类
{
    public void PrintOut(string s)   //实现接口的方法
    {
       Console.WriteLine("A message:  {0}", s);
    }
}

class DerivedClass:BaseClass, IIfc1  //派生类
{

}

class Program
{
    static void Main()
    {
         DerivedClass dc = new DerivedClass();
         dc.PrintOut("Success!");
    }
}

 

接口可以继承接口

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

interface IIfc1
{
   void func1();
}

interface IIfc2
{
  void func2();
}

interface IIfc3:IIfc1,IIfc2
{

}

class MyClass4:IIfc3
{
  public void func1()
  {
      //func1的实现
  }

  public void func2()
  {
     //func2的实现
  }
}

继承自基接口的接口包含它声明的所有接口所有基接口的成员。

 

 

 

参考资料

《C#图解教程-第四版》  作者 【美】 Daniel M.Solis

 

 

C#学习(二):接口

标签:通过   c#   this   参考   重复   成员函数   function   签名   str   

原文地址:http://www.cnblogs.com/0kk470/p/7491646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!