C#接口实例讲解.docx
- 文档编号:23827979
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:20
- 大小:19.72KB
C#接口实例讲解.docx
《C#接口实例讲解.docx》由会员分享,可在线阅读,更多相关《C#接口实例讲解.docx(20页珍藏版)》请在冰豆网上搜索。
C#接口实例讲解
1.cs
程序代码:
classDemo{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
}
interfaceabc{
}
输出:
HelloInterfaces
编译运行上面的程序运行程序并显示出期望的结果。
这段程序包含一个Demo类程序入门Main()方法中打印“HelloInterfaces”。
在上面的程序中还定义了接口abc。
abc接口是空的,可以在接口中添加一些元素。
P2.cs
程序代码:
classDemo{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
}
interfaceabc{
intx;
}
输出:
P2.cs(11,3):
errorCS0525:
Interfacescannotcontainfields
错误!
在C#的接口中不能包含字段例如变量。
上面的程序在接口abc中声明了一个整型变量x。
编译将会出错。
P3.cs
程序代码:
classDemo{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
}
interfaceabc{
voidxyz(){
System.Console.WriteLine("Inxyz");
}
}
输出:
P3.cs(11,8):
errorCS0531:
'abc.xyz()':
interfacememberscannothaveadefinition
这次在接口中定义了xyz()方法C#编译器发现了错误。
这说明在接口中成员不能有定义。
也就意味着如果在接口abc中仅仅只有方法的声明编译器将认为正确?
P4.cs
程序代码:
classDemo{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
}
interfaceabc{
voidxyz();
}
输出:
HelloInterfaces
上面的程序编译运行正常产生期望的输出结果。
最后编译成功。
在C#的接口中仅仅包含方法的定义。
现在看看方法的作用。
接口是类实现的规范。
也就是说接口规定了方法的原型并有类来实现接口所定义的方法原型。
因此在类Demo和接口abc结合在一起。
P5.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
}
interfaceabc{
voidxyz();
}
输出:
P4.cs(1,7):
errorCS0535:
'Demo'doesnotimplementinterfacemember'abc.xyz()'
P4.cs(11,8):
(Locationofsymbolrelatedtopreviouserror)
在上面的代码中Demo和接口abc通过“demo:
abc”联系在一起,通常对于这个结合有一点小的误会。
类Demo需要负责定义接口abc中定义的方法原型。
因此在上面代码中的Demo没有实现abc接口中定义的xyz的方法,上面的代码出错。
为了修正问题,类Demo必须实现接口abc中定义的方法原型xyz。
看下面的程序代码。
P6.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
}
voidxyz(){
System.Console.WriteLine("Inxyz");
}
}
interfaceabc{
voidxyz();
}
输出:
a.cs(1,7):
errorCS0536:
'Demo'doesnotimplementinterfacemember'abc.xyz()'.'Demo.xyz()'iseitherstatic,notpublic,orhas thewrongreturntype.
a.cs(16,8):
(Locationofsymbolrelatedtopreviouserror)
a.cs(7,8):
(Locationofsymbolrelatedtopreviouserror)
又出现错误!
类Demo实现了方法xyz但没有足够的访问权限。
在接口abc定义的方法xyz的访问权限是public。
看下面的代码。
P7.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
Demodemo=newDemo();
System.Console.WriteLine("HelloInterfaces");
demo.xyz();
}
publicvoidxyz(){
System.Console.WriteLine("Inxyz");
}
}
interfaceabc{
voidxyz();
}
输出:
HelloInterfaces
Inxyz
好的!
上面的代码编译运行成功产生预期的输出结果。
正如前面提及的接口可以调用实现相同的接口的不同的类。
因此,需要不同的实现相同接口的类。
在上面的代码中类Demo实现了接口abc。
下面让另一个类Sample也实现接口abc。
P8.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
DemorefDemo=newDemo();
refDemo.xyz();
SamplerefSample=newSample();
refSample.xyz();
}
publicvoidxyz(){
System.Console.WriteLine("InDemo:
:
xyz");
}
}
interfaceabc{
voidxyz();
}
classSample:
abc{
publicvoidxyz(){
System.Console.WriteLine("InSample:
:
xyz");
}
}
输出:
InDemo:
:
xyz
InSample:
:
xyz
上面的程序编译运行成功生产期望的输出结果。
refDemo是类Demo的实例。
refSample是类Sample的实例。
这两个类都实现了接口abc因此他们都实现了方法xyz()。
从程序入口Main()方法中通过refDemo和refSample实例分别调用了类Demo和类Sample的xyz()方法。
现在有两个不同的类实现了相同的接口此时显示了如何从不同的类中使用相同的接口引用。
P9.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
abcrefabc=null;
refabc=newDemo();
refabc.xyz();
refabc=newSample();
refabc.xyz();
}
publicvoidxyz(){
System.Console.WriteLine("InDemo:
:
xyz");
}
}
interfaceabc{
voidxyz();
}
classSample:
abc{
publicvoidxyz(){
System.Console.WriteLine("InSample:
:
xyz");
}
}
输出:
InDemo:
:
xyz
InSample:
:
xyz
上面的代码编译运行程序产生了预期的输出结果。
在Main()方法中定义了接口引用refabc是接口abc类型。
实例化为Demo在refabc中存储了类Demo类定义的xyz()可以通过refabc来调用。
接下去,实例化为Sample在refabc中存储了类Sample类定义的xyz()可以通过refabc来调用。
因此,可以通过共同的接口引用refabc来访问不同的类Demo和Sample中的xyz()的方法。
在下面的代码中使用循环调用类Demo和Sample实现相同接口abc使用单一接口引用refabc类型匹配的接口abc的类的实现。
P10.cs
程序代码:
classDemo:
abc{
publicstaticvoidMain(){
abc[]refabc={newDemo(),newSample()};
for(inti=0;i<=1;i++)
refabc[i].xyz();
}
publicvoidxyz(){
System.Console.WriteLine("InDemo:
:
xyz");
}
}
interfaceabc{
voidxyz();
}
classSample:
abc{
publicvoidxyz(){
System.Console.WriteLine("InSample:
:
xyz");
}
}
输出:
InDemo:
:
xyz
InSample:
:
xyz
上面的代码编译运行程序产生了预期的输出结果。
refabc是一个类型为abc接口的数组。
它保存了类Demo和Sample的对象的引用。
在for循环中,使用数字refabc,可以调用类Demo和Sample中的方法xyz()。
一个类可以实现多个接口。
看下面的程序。
P11.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
abcrefabc=newDemo();
refabc.xyz();
}
publicvoidxyz(){
System.Console.WriteLine("Inxyz");
}
publicvoidpqr(){
System.Console.WriteLine("Inxyz");
}
}
interfaceabc{
voidxyz();
}
interfacedef{
voidpqr();
}
输出:
HelloInterfaces
Inxyz
fghdhdhfdh
上面的代码编译运行程序产生了预期的输出结果。
类Demo实现了接口abc并且实现了xyz()方法。
类Demo也实现了def接口也实现了pqr()方法。
refabc是类型为abc接口的变量是类Demo的实例。
可以通过refabc的实例调用Demo中xyz()方法就像refabc是接口abc的类型包含了xyz()方法的原型
P12.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
abcrefabc=newDemo();
refabc.xyz();
refabc.pqr();
}
publicvoidxyz(){
System.Console.WriteLine("Inxyz");
}
publicvoidpqr(){
System.Console.WriteLine("Inxyz");
}
}
interfaceabc{
voidxyz();
}
interfacedef{
voidpqr();
}
输出:
P11.cs(9,5):
errorCS0117:
'abc'doesnotcontainadefinitionfor'pqr'
错误!
尝试通过定义为接口abc类型的变量refabc的Demo实例来访问pqr()方法,在接口abc中包含了函数xyz()的原型但没有包含pqr()方法原型。
可以通过类型为接口def的Demo实例来方法pqr()方法因为接口def包含方法pqr()的原型。
Safsdgfsgfgh
下面的程序代码将这样实现。
P13.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
DemorefDemo=newDemo();
abcrefabc=refDemo;
refabc.xyz();
defrefdef=refDemo;
refdef.pqr();
}
publicvoidxyz(){
System.Console.WriteLine("Inxyz");
}
publicvoidpqr(){
System.Console.WriteLine("Inpqr");
}
}
interfaceabc{
voidxyz();
}
interfacedef{
voidpqr();
}
输出:
HelloInterfaces
Inxyz
Inpqr
上面的代码编译运行程序产生了预期的输出结果。
类Demo实现了接口abc和def。
一个类Demo的对象创建并将引用存储在refDemo中。
refabc是类型为接口abc的变量指向类Demo的实例。
在Deom中的xyz()方法可以通过refabc来方法因为refabc是接口abc的变量接口abc包含了方法xyz()的原型。
同样,refdef是类型为def的变量指向类Demo的实力。
可以通过refdef来方法Demo中的pqr()方法,因为refdef是类型为接口def的变量,接口def中包括了方法pqr()的原型。
P14.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
DemorefDemo=newDemo();
abcrefabc=refDemo;
refabc.xyz();
defrefdef=refDemo;
refdef.xyz();
}
publicvoidxyz(){
System.Console.WriteLine("Inxyz");
}
}
interfaceabc{
voidxyz();
}
interfacedef{
voidxyz();
}
输出:
HelloInterfaces
Inxyz
Inxyz
上面的代码编译运行程序产生了预期的输出结果。
接口abc和def都定义了方法xyz()的原型。
类Demo实现接口abc和def并也实现了xyz()的方法。
因此可以通过接口变量(refabc或refdef)存储在refabc或refdef的Demo的对象引用来访问方法xyz()。
假设一个问题,实现接口abc中的xyz()的方法和实现接口def中的xyz()的方法是不同的在类Demo中如何实现?
此时需要按下面的程序使用完全限定名来实现。
P15.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
DemorefDemo=newDemo();
abcrefabc=refDemo;
refabc.xyz();
defrefdef=refDemo;
refdef.xyz();
}
publicvoidabc.xyz(){
System.Console.WriteLine("Inabc.xyz");
}
publicvoiddef.xyz(){
System.Console.WriteLine("Indef.xyz");
}
}
interfaceabc{
voidxyz();
}
interfacedef{
voidxyz();
}
输出:
a.cs(13,15):
errorCS0106:
Themodifier'public'isnotvalidforthisitem
a.cs(18,15):
errorCS0106:
Themodifier'public'isnotvalidforthisitem
失败!
使用了全缀名得到错误。
原因是当为接口中的部分方法原型使用全缀名是,编译器不能使用想public的修饰符。
因此从上面的代码中去掉public。
P16.cs
程序代码:
classDemo:
abc,def{
publicstaticvoidMain(){
System.Console.WriteLine("HelloInterfaces");
DemorefDemo=newDemo();
abcrefabc=refDemo;
refabc.xyz();
defrefdef=refDemo;
refdef.xyz();
}
voidabc.xyz(){
System.Console.WriteLine("Inabc.xyz");
}
voiddef.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 接口 实例 讲解