标签:通过 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# this 参考 重复 成员函数 function 签名 str
原文地址:http://www.cnblogs.com/0kk470/p/7491646.html