关闭

接口意义

66人阅读 评论(0) 收藏 举报

首先,我们必须明确,接口是一个类。

 

“接口是一个特殊的类,又是一个特别有意义的类,不是因为它的特殊,而是因为它的意义,叫它接口更合适,但不能忘了,它仍是类。”

 

“接口是一个只有声明,没有实现的类。”

 

很多人纠结于接口只是一个标准,是一个契约,而忘记了它的意义。

 

下面我们来看这样一个问题:

话说有家影视公司选拔偶像派男主角,导演说了,男演员,身高是王道。于是有下面代码:

 

public class Actor
{
    private string name;
    private int height;
 
    public Actor(string name, int height)
    {
        this.name = name;
        this.height = height;
    }
    public string Name
    {
        get { return this.name; }
    }
    public int Height
    {
        get { return this.height; }
    }
     
    public int CompareTo(object obj)
    {
        return this.height - ((Actor)obj).height;
    }
 
    public string GetName()
    {
        return this.name;
    }
}

 

 

这个类,除了可以存放男演员的基本信息,还定义了一个函数publicint CompareTo(object obj),因为,我们要比较男演员的身高,用身高判断哪个演员更好。

有了这个类,后面,你可以比较轻松地编写代码,判断是刘德华更优秀,还是潘长江更优秀了,这个代码,我这里就略过去了….

 

(儿童不宜,此处省略1000行)……………….

 

 

现在的问题是,明天又要选拨女演员了,导演说了,女演员,苗条是王道。女演员的这个类,你肯定是要做的,只是….

 

只是,我刚才略过去的,让你编写的代码,你是不是还要再重新编写呢????

 

这等于又重新编写了一个程序。

 

这时,我们就想到了接口,我们来接着看代码吧:

我先做一个接口:

 

using System;
 
namespace WestGarden.IDAL
{
    public interface ISelectPlayer
    {
        string GetName();
 
        int CompareTo(object obj);
    }
}

 

 

这个接口,定义了两个函数,一个,当然是要进行比较,标准由你定,你说是导演定的,那更好,不用你费脑子了。

 

我们把刚才做的男演员的类,按照这个接口的标准来实现,也就是继承这个接口:

 

using System;
 
using WestGarden.IDAL;
 
namespace WestGarden.DAL
{
    public class Actor:ISelectPlayer
    {
        private string name;
        private int height;
 
        public Actor(string name, int height)
        {
            this.name = name;
            this.height = height;
        }
        public string Name
        {
            get { return this.name; }
        }
        public int Height
        {
            get { return this.height; }
        }
        
        public int CompareTo(object obj)
        {
            return this.height - ((Actor)obj).height;
        }
 
        public string GetName()
        {
            return this.name;
        }
    }
}

 

 顺手,把女演员的类也做了吧:

 

using System;
 
using WestGarden.IDAL;
 
namespace WestGarden.DAL
{
    public class Actress:ISelectPlayer
    {
        private string name;
        private int weight;
         
        public Actress(string name, int weight){
            this.name = name;
            this.weight = weight;
        }
 
        public string Name
        {
            get { return this.name; }
        }
        public int Weight
        {
            get { return this.weight; }
        }
 
   
        public int CompareTo(object obj)
        {
            return ((Actress)obj).weight - this.weight;
        }
 
        public string GetName()
        {
            return this.name;
        }
    }
}

 

这时,我们在应用层这样编写代码:

 

using System;
 
using WestGarden.IDAL;
using WestGarden.DAL;
 
namespace WestGarden.Web
{
    public partial class Select : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Actor actor1 = new Actor("潘长江", 150);
            Actor actor2 = new Actor("刘德华", 180);
 
            Actress actress1 = new Actress("巩俐", 120);
            Actress actress2 = new Actress("周迅", 80);
 
            Response.Write("最佳男演员是:"+WhoIsBetter(actor1, actor2)+"</br>");
            Response.Write("最佳女演员是:"+WhoIsBetter(actress1, actress2)+"</br>");
        }
 
        //这里就象一个USB口一样工作着,无论你插上的是男演员、女演员...,只要它继承的是ISelectPlayer接口。
        public string WhoIsBetter(ISelectPlayer a, ISelectPlayer b)
        {
            if (a.CompareTo(b) > 0)
                return a.GetName();
            else
                return b.GetName();
        }
    }
}

  

注意:

我们做的这个函数,publicvoid WhoIsBetter(ISelectPlayer a,ISelectPlayer b)

 

这个函数,形参是ISelectPlayer,是接口,我认为,接口的意义,就在这里。

 

你实现接口的类是男演员也好,女演员也好,男主角也好、女主角也好、男配角也好、女配角也好、男群众演员也好、女群众演员也好,只要你继承的是我这个ISelectPlayer,或者,你习惯于说,遵守了我这个接口的标准、或者契约,我这段代码,都不需要改变!!

 

这和那个比方是一样的,不管你插在USB接口的是U盘,还是移动硬盘,还是什么mp3,还是mp4,还是你新发明的什么东西,只要你能插在我的USB口上,我主机都不需要做任何改变,直接在上面读取或者写入数据。

 

这个,是硬件接口的意义所在,也是我们这个ISelectPlayer类的意义所在,因为它有了这个伟大的意义,才把它改叫为接口的,因为,它象USB接口一样工作着……

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

JAVA中接口存在的意义

很多JAVA初级程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。好像定义接口是提前做了个多余的工作。下面我给大家总结了4点关于JAVA中接口存在的意义:        ...
  • zhouchao001
  • zhouchao001
  • 2015-12-13 17:36
  • 1671

Java基础之深入理解接口(interface)意义

在学习接口的时候,一致没有理解透彻
  • boer521314
  • boer521314
  • 2014-10-22 16:10
  • 3623

关于接口的定义和使用,几点需要注意的问题

1、在接口中定义的成员变量:变量默认属于public static final类型,也就是静态不可修改的变量,即为常量了,下面几种写法都可以,java在编译时会统一处理成public static f...
  • u010698072
  • u010698072
  • 2016-08-14 23:16
  • 1471

简单的实例理解接口的伟大意义

首先,我们必须明确,接口是一个类。 “接口是一个特殊的类,又是一个特别有意义的类,不是因为它的特殊,而是因为它的意义,叫它接口更合适,但不能忘了,它仍是类。” “接口是一个只有声明,没有实...
  • tsoss
  • tsoss
  • 2012-05-26 15:26
  • 205

Java基础之深入理解接口(interface)意义

在学习接口的时候,一致没有理解透彻
  • boer521314
  • boer521314
  • 2014-10-22 16:10
  • 3623

详解Android接口Interface的使用和意义

本文介绍是Android的一个重要的东西,接口Interface,详解两个方面: (1)Java是继承的,接口Interface是可以多个的,恰恰弥补了这个缺点。 (2)回调,接口Interface里...
  • qq_29623203
  • qq_29623203
  • 2016-04-20 01:30
  • 15747

终于明白了虚函数、纯虚函数和接口的实用方法和意义

从理论上来说,这三个概念很容易背的滚瓜烂熟,但是从大学毕业到现在,我都没真正搞明白这三个东西的出现,究竟是为了做到什么事情。 也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到...
  • huangyimo
  • huangyimo
  • 2016-01-08 08:55
  • 6774

JAVA中接口存在的意义

很多JAVA初级程序员对于接口存在的意义很疑惑。不知道接口到底是有什么作用,为什么要定义接口。好像定义接口是提前做了个多余的工作。下面我给大家总结了4点关于JAVA中接口存在的意义:        ...
  • zhouchao001
  • zhouchao001
  • 2015-12-13 17:36
  • 1671

[Unity&C#]浅谈接口interface 的意义

Interfaces 官方视频教程 通常如果要 定义 一个 接口类 Interface  public interface ITest { } 在Test前面加上 大写 的 I ,表示 int...
  • BuladeMian
  • BuladeMian
  • 2017-06-07 14:36
  • 884

微信公众平台开放 9 大高级接口,它有什么意义?

微信的野心大大的,看看它的9大新接口吧。 转自:http://www.ifanr.com/366010 微信刚刚更新公众平台,向服务号开放微信认证,开放 9 大高级接口,增加开发者问答系统...
  • tiger119
  • tiger119
  • 2013-11-10 22:32
  • 11057
    个人资料
    • 访问:278次
    • 积分:36
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章存档