误导人的接口(interface)
接口,interface,这个词语有误导之嫌。窃以为,这也是其名称与实际开发不符,造成难于直观理解和使用过程中产生困惑的根源。所谓名不正则言不顺;不怕生错命,最怕改坏名。
在现实生活中,接口通常是指将两样东西结合在一起的部位,比如水龙头与水管的接口,插头与插座的接口。但在编码里面,我还没见过接口是在起这种作用:定义了一个接口,然后某个类实现了这个接口,难道是为了便于与其他的什么类接合在一起的吗?好像没有吧。
当然你可以讲,不管是什么水龙头,你只要是这种接口,你都可以接到这个水管里来;不管是什么牌子的插头,只要是这种双脚,也都可以插到这个插座里来,这就是接口的好处。问题是,很明显,现实生活中的接口,就是为了将不同的东西接合在一起,接口一词很准确,也很容易理解,但在我们编码里面,接口是为了接合的吗?
所以开发语言里“接口”这个名称,真的是很让人困惑。
我觉得将接口理解成身份更加符合实际。
不是吗?一个类可以实现多个接口,正如一个人可以拥有多个身份一样。
好比说,张三在家里是父亲,丈夫,在公司里是开发主管,那么他就拥有了3个身份,也就是实现了3个接口:父亲、丈夫、开发主管。
于是,同是张三这个人,外界不同的人就可以将他分别对待,分别打交道(调用)了:
对孩子来说,张三是父亲,他会 教育()、呵护()、讲故事();
对妻子来说,张三是丈夫,他拥有 养家()、敦伦() 等功能;
对公司来说,张三是开发主管,可以 制订工作计划()、开发()、指导下属() 等等。
如果用代码来表示,是这样:
class WhatIsInterface
{
abstract class Person
{//人类
string _name;
public Person(string name)
{
this._name = name;
}
public string Name
{
get
{
return _name;
}
}
}
interface IHusband
{//丈夫接口
void GetMoney();
void MakeLove();
}
interface IFather
{//父亲接口
void Teach();
void Care();
void SayStory();
}
interface IManager
{//开发主管接口
void Planning();
void Coding();
void Guide();
}
class ItOldMan : Person,IFather,IHusband,IManager
{//IT老男人类
public ItOldMan(string name) : base(name) { } //实现父亲接口
public void Teach()
{
Console.WriteLine(String.Format("{0}细心教育孩子",Name));
}
public void Care()
{
Console.WriteLine(String.Format("{0}很疼爱自己的孩子",Name));
}
public void SayStory()
{
Console.WriteLine(String.Format("{0}睡觉前给孩子讲故事",Name));
} //实现丈夫接口
public void GetMoney()
{
Console.WriteLine(String.Format("{0}要努力赚钱养家",Name));
}
public void MakeLove()
{
Console.WriteLine(String.Format("{0}:雅蠛蝶。。。",Name));
} //实现开发主管接口
public void Planning()
{
Console.WriteLine(String.Format("{0}需要制订工作计划",Name));
}
public void Coding()
{
Console.WriteLine(String.Format("{0}是开发主力",Name));
}
public void Guide()
{
Console.WriteLine(String.Format("{0}常常指导下属各种问题",Name));
}
}
//应用部分
class Wife
{//妻子类
private IHusband _husband;
public Wife(IHusband husband)
{
this._husband = husband;
}
public void MyHusband()
{
split("丈夫");
_husband.GetMoney();
_husband.MakeLove();
}
}
class Daughter
{//女儿类
private IFather _father;
public Daughter(IFather father)
{
this._father = father;
}
public void MyFather()
{
split("父亲");
_father.Care();
_father.Teach();
_father.SayStory();
}
}
class Department
{//部门类
private IManager _manager;
public Department(IManager manager)
{
this._manager = manager;
}
public void MyManager()
{
split("开发主管");
_manager.Planning();
_manager.Coding();
_manager.Guide();
}
}
static void split(string subject)
{
Console.WriteLine();
Console.WriteLine(String.Format("作为 {0} 的角色",subject));
Console.WriteLine("---------------------------");
}
static void Main(string[] args)
{
//张三
ItOldMan zhang3 = new ItOldMan("张三"); //张三的爱人
Wife wife = new Wife(zhang3);
wife.MyHusband(); //张三的小孩
Daughter daughter = new Daughter(zhang3);
daughter.MyFather(); //张三的部门
Department department = new Department(zhang3);
department.MyManager(); Console.ReadLine();
}
}
运行结果
同一个ItOldMan对象 zhang3,传给不同的类,这些类分别应用了它不同的身份。
其中,对妻子类而言,一个 ItOldMan 对象传给她,赋给了她的 IHusband 对象,那么在这里,这个 ItOldMan 就只是一个丈夫对象,她访问的也只是ItOldMan里面有关丈夫的方法。其他也类似。也就是说,ItOldMan实现了许多接口,拥有多种身份,用哪种身份(接口)来访问它,它就表现出什么身份。接口在这里的作用,有点类似语文中,以部分代替整体的“借代”修辞手法。
//张三的爱人
Wife wife = new Wife(zhang3);
wife.MyHusband();
class Wife
{//妻子类
private IHusband _husband;
public Wife(IHusband husband)
{
this._husband = husband;
}
public void MyHusband()
{
split("丈夫");
_husband.GetMoney();
_husband.MakeLove();
}
}
这让我想起以前学过的课文,说同是一棵树,在植物学家眼里,它是一种什么科什么属的研究对象;在木匠眼里,它可以做成漂亮的家具;而在樵夫眼里,它只是一堆柴。就看你用什么眼光,站在什么角度去看它,又或者说,你用什么接口去调用它。
接口有强制性,即里面的方法继承类需要全部实现,因此说它是一种强制性契约,一种规范,从这个角度看,接口跟现实生活中所说的“接口”是相等的,接口不对,就接不进去,就套不进去。但更多时候,在编程里面,它更加倾向于表现为是一种身份。用身份来理解,更加直观。
误导人的接口(interface)的更多相关文章
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- java之接口interface
接口 1.多个无关的类可以实现同一个接口 2.一个类可以实现多个无关的接口 3.与继承关系类似,接口与实现类之间存在多态性 4.定义java类的语法格式 < modifier> class ...
- Java接口interface
Java接口interface 1.多个无关的类可以实现同一个接口. 2.一个类可以实现多个无关的接口. 3.与继承关系类似,接口与实现类之间存在多态性. 接口(interface)是抽象方法和常量值 ...
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...
- Go接口interface
目录 接口是什么? interface类型 空接口(interface{}) interface函数参数 interface变量存储的类型 类型断言 嵌入interface 接口是什么? Go 语言不 ...
- delphi 接口Interface
学习 delphi 接口 一切都是纸老虎!!! 第四章 接口 前不久,有位搞软件的朋友给我出了个谜语.谜面是“相亲”,让我猜一软件术语.我大约想了一分钟,猜 出谜底是“面向对象”.我 ...
- JavaSE入门学习21:Java面向对象之接口(interface)(二)
一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.j ...
- 0507 构造代码块和static案例,接口interface
0507构造代码块和static案例,接口interface [重点] 1.局部变量,成员变量,静态变量的特点 2.接口 接口语法:interface A {} 接口内的成员变量[缺省属性]publi ...
- java中的接口interface
关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...
随机推荐
- 尽量不要用select into 复制表
select into 复制表会带来灾难后果,因为只是复制了一个外壳,就像克隆人,有躯体没意识,像原表的主键 外键 约束 触发器 索引都不会被复制过来, 创建一个表:CREATE TABLE [dbo ...
- windows下安装wamp和wordpress
安装wamp WAMP是一个windows上的php开发集成环境,一键安装php,apache和mysql,非常方便. 双击wampserver2.2exxxxxxxxxx.exe文件进行安装,安装过 ...
- ios 将状态栏改为白色方法!
1在Info.plist中设置UIViewControllerBasedStatusBarAppearance 为NO2 在需要改变状态栏颜色的ViewController中在ViewDidLoad方 ...
- XMPPFramework ios 例子中链接服务器失败,opnefire 服务器链接失败
首先说下上周又做了几天得无用功, 之前一直用的是ejabberd ,这次换了opnefire,有人说opnefire跟新的xmpp协议不兼容,后来又更换成了ejabberd, Github 上得dem ...
- Azure cache 的配置与应用
最近公司的项目要是用cloud Service 所以研究了下 Azure cache 的配置与使用. 首先创建项目 第二步 配置 cache worker role (1) 点击 cache work ...
- 【html】【6】div浮动float
我想 当看完上面的必看链接,拥有一定的基础后也得7天左右, 记住 一定要看完,知道它都有什么,没学会不要紧,哪怕只是有个简单的概念也行, 随着后续的使用慢慢深入学习,现在开始div布局. 必看参考: ...
- 24种设计模式--建造者模式【Builder Pattern】
在一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我“牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增加了一个新需求:汽车的启动.停止.喇 ...
- 通过EL表达式,后台数据传到前台,引号及后面的数据被截断的问题:
问题描述: 通过EL表达式,后台数据传到前台,引号及后面的数据被截断的问题: 如: 前端页面: html: 问题解决: 1.一个简单的办法,把 input 写成这样: <input type=& ...
- Python转码问题
在Python中,可以对String调用decode和encode方法来实现转码. 比如,若要将某个String对象s从gbk内码转换为UTF-8,可以如下操作 s.decode('gbk').e ...
- WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)
开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1) 简单数据绑定 简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性.采用如下形式进行绑定 ...