初识C#接口
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。
接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。
接口是引用类型的,类似于类,和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
C#接口的作用
1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类《至少》要实现哪些功能,继承它的类可以增加自己的方法.
2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它们都继承了接口"动物",其中动物里面有个方法Behavior(),那么狗和猫必须得实现Behavior()方法,并且都命名为Behavior这样就不会出现命名太杂乱的现象.如果命名不是Behavior(),接口会约束即不按接口约束命名编译不会通过.
3.提供永远的接口。 当类增加时,现有接口方法能够满足继承类中的大多数方法,没必要重新给新类设计一组方法,也节省了代码,提高了开发效率
声明接口
接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。下面是一个接口声明的实例:
//公共接口: "动物"
public interface IAnimal
{
void Behavior(); //行为方法,描述各种动物的特性
} //类: 狗
public class Dog : IAnimal
{
public void Behavior()
{
//Console.Write("我晚上睡觉,白天活动");
MessageBox.Show("我晚上睡觉,白天活动");
}
} //类: 猫
public class Cat : IAnimal
{
public void Behavior()
{
//Console.Write("我白天睡觉,晚上活动");
MessageBox.Show("我白天睡觉,晚上活动");
}
}
//简单的应用:
public static Main()
{
Dog myDog = new Dog();
myDog.Behavior(); //输出: "我晚上睡觉,白天活动"
Cat myCat = new Cat();
myCat.Behavior(); //输出: "我白天睡觉,晚上活动"
}
以上调用不同的类的相同名方法,会输出不同的东东,也就是说每个类里面的同名方法完成的功能可以是完全不同的.
更进一步,不是用上面Main方法这样一个一个调用类的方法,用多态性实现其调用.
看一下下面这个方法:
public void Behavior(IAnimal myIanimal)
{
myIanimal.Behavior();
}
其参数是接口类型,任何继承它的类都可以调用此方法,此方法能根据类的不同调用不同的类 中的方法. 也即能够自己根据不同的类,完成不同的类的功能.
多态性代码示例:
Dog myDog = new Dog();
Cat myCat = new Cat();
Behavior(myDog); //Behavior接受“狗”类实例
Behavior(myCat); //Behavior接受“狗”类实例
这样Behavior方法写一次就能完成所有继承它的类中的相同名方法的不同功能. 非常方便,同样,由于“动物软件”功能需求,需要再增加一个"龟"类:
//类: 龟
public Tortoise: IAnimal
{
public void Behavior()
{
MessageBox.Show("我可以不活动,一睡就睡五千年!");
}
}
那么也可以调用上面多态方法,所以说接口使方法具有较好扩展性. 如果继承它的类很多的话,有多少好处是可想而知的!(出处:http://blog.csdn.net/yunhaic/article/details/6662843)
同样,假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示;Delphi程序员指的是用Delphi写程序的程序员,用clsDelphiProgramer这个类来表示。每个类都有一个WriteCode()方法。定义如下:
public class clsVBProgramer
{
public void WriteCode()
{
//用VB语言写代码;
}
} public class clsDelphiProgramer
{
public void WriteCode()
{
//用Delphi语言写代码;
}
} public class clsProject
{
public void WritePrograme(clsVBProgramer programer)//用VB写代码
{
programer.WriteCode();
}
public void WritePrograme(clsDelphiProgramer programer)//重载方法,用Delphi写代码
{
programer.WriteCode();
}
} static void Main(string[] args)
{
clsProject proj = new clsProject();
//如果需要用VB写代码
clsVBProgramer programer1 = new clsVBProgramer();
proj.WritePrograme(programer1);
//如果需要用Delphi写代码
clsDelphiProgramer programer2 = new clsDelphiProgramer();
proj.WritePrograme(programer2);
}
但是如果这时公司又来了一个C#程序员,我们怎么改这段程序,使它能够实现用C#写程序的功能呢?我们需要增加一个新类clsCSharpProgramer,同时在此clsProject这个类中要再次重载WritePrograme(clsCSharpProgramer programer)方法。这下麻烦多了。如果还有C程序员,C++程序员,JAVA程序员呢。麻烦大了!
但是如果改用接口,就完全不一样了:
首先声明一个程序员接口:
class Program
{
static void Main(string[] args)
{
clsProject proj = new clsProject();
IProgramer programer;
//如果需要用VB写代码
programer = new clsVBProgramer();
proj.WritePrograme(programer);
//如果需要用Delphi写代码
programer = new clsDelphiProgramer();
proj.WritePrograme(programer); }
}
/// <summary>
/// 声明接口
/// </summary>
public interface IProgramer
{
void WriteCode();
}
//然后声明类,并实现IProgramer接口:
/// <summary>
/// VB程序员实现的WriteCode方法
/// </summary>
public class clsVBProgramer : IProgramer
{
public void WriteCode()
{
//用VB语言写代码;
Console.WriteLine("我是VB程序员实现的");
}
}
/// <summary>
/// Delphi程序员实现的WriteCode方法
/// </summary>
public class clsDelphiProgramer : IProgramer
{
public void WriteCode()
{
//用Delphi语言写代码;
Console.WriteLine("我是Delphi程序员实现的");
}
}
/// <summary>
/// CSharp程序员实现的WriteCode方法
/// </summary>
public class clsCSharpProgramer : IProgramer
{
public void WriteCode()
{
//用Delphi语言写代码;
Console.WriteLine("我是CSharp程序员实现的");
}
}
/// <summary>
/// 项目
/// </summary>
public class clsProject
{
public void WritePrograme(IProgramer programer)
{
programer.WriteCode();//写代码
}
}
这样的如果再有程序员添加进来的话,我们只需把它们相关的类加进来,然后在main()中稍做修改就OK了。扩充性特别好!
另外我们如果把clsProject这个类封成一个组件,那么当我们的用户需要要扩充功能的时候,我们只需要在外部做很小的修改就能实现,可以说根本就用不着改动我们已经封好组件!这样就很方便,很强大!(出处:http://blog.jobbole.com/85751/)
该文纯粹属于个人学习,有不足之处请多多指教!(文章部分内容摘自网络,如果侵犯您的权益,请及时联系我,谢谢。)
初识C#接口的更多相关文章
- 初识IStructuralEquatable接口
System.Collections.IStructuralEquatable 是 .NET Framework 4.5 新引入的一个接口,位于System.Runtime.dll程序集中. MSDN ...
- Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...
- 初识WSGI接口
WSGI WSGI全称为Web Server Gateway Interface,WSGI允许web框架和web服务器分开,可以混合匹配web服务器和web框架,选择一个适合的配对.比如,可以在Gun ...
- SDI初识
SDI初识 SDI接口,即“数字分量串行接口(Serial Digital Interface)”.按照速率可以分为: 标准清晰度SD-SDI,速率为270Mb/s; 高清标准HD-SDI,速率为1. ...
- 程序员不得不知道的 API 接口常识
说实话,我非常希望两年前刚准备找实习的自己能看到本篇文章,那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写. 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加.修 ...
- Python爬取CSDN博客文章
0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...
- .net 温故知新:【8】.NET 中的配置从xml转向json
一.配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式 ...
- 初识 go 语言:方法,接口及并发
目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接 ...
- 初识Django —Python API接口编程入门
初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...
随机推荐
- submit text3常用快捷键
在网上找了一些submit text的快捷键: Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的 ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- IdentityServer4 使用OpenID Connect添加用户身份验证
使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- Android Studio切换为eclipse的快捷键之后还是有区别的部分快捷键
Android Studio Eclipse 把代码提示换成了Class Name Completion, 快捷键是Ctrl+Alt+Space(空格键). 代码提示快捷键Alt+/, ...
- Firebug中调试中的js脚本中中文内容显示为乱码
Firebug中调试中的js脚本中中文内容显示为乱码 设置 页面 UFT-8 编码没用, 解决方法:点击 "Firebug"工具栏 中的"选项"---" ...
- 邻接矩阵的深度优先遍历(java版)
这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.dat ...
- [PHP源码阅读]trim、rtrim、ltrim函数
trim系列函数是用于去除字符串中首尾的空格或其他字符.ltrim函数只去除掉字符串首部的字符,rtrim函数只去除字符串尾部的字符. 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下 ...
- Concurrency != Parallelism
前段时间在公司给大家分享GO语言的一些特性,然后讲到了并发概念,大家表示很迷茫,然后分享过程中我拿来了Rob Pike大神的Slides <Concurrency is not Parallel ...
- EventBus总线讲解
在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 us ...