`
webcode
  • 浏览: 5929476 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

ASP.NET基础知识:简单的实例理解接口的伟大意义

yousuosi 2012-5-26

http://blogs.csdn.net/yousuosi

源代码:13033480群共享

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

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

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

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

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

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

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行).

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

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

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

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

我先做一个接口,这个接口:

namespace WestGarden.IPlayer
{
    public interface ISelectPlayer
    {
        string GetName();

        int CompareTo(object obj);
    }
}


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

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

using System;

using WestGarden.IPlayer;

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.IPlayer;

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;
        }
    }
}


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

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);

    WhoIsBetter(actor1, actor2);

    WhoIsBetter(actress1, actress2);
}

public void WhoIsBetter(ISelectPlayer a, ISelectPlayer b)
{
    if (a.CompareTo(b) > 0)
        Response.Write(a.GetName());
    else
        Response.Write(b.GetName());
}

注意:

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

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

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

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

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

文中观点思想来源于博客:

http://www.cnblogs.com/WestGarden/

文中实例创意来源于:

http://www.cnblogs.com/wu-jian/archive/2012/05/24/2516284.html

在些一并感谢!

版权所有©2012,西园电脑工作室.欢迎转载,转载请注明出处.更多文章请参阅博客http://blog.csdn.com/yousuosi

分享到:
评论

相关推荐

    计算机组成原理:硬件软件接口 原书第5版课后答案

     增加“运行更快”这一新实例,说明正确理解硬件技术的重要性,它能使软件性能提高200倍。  讨论并强调计算机体系结构的“8个伟大思想”——通过并行提高性能、通过流水线提高性能、通过预测 提高性能、面向摩尔...

    计算机组成与设计练习答案

     增加“运行更快”这一新实例,说明正确理解硬件技术的重要性,它能使软件性能提高200倍。  讨论并强调计算机体系结构的“8个伟大思想”——通过并行提高性能、通过流水线提高性能、通过预测提高性能、面向摩尔...

    Spring.3.x企业应用开发实战(完整版).part2

    3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 ...

    Spring3.x企业应用开发实战(完整版) part1

    3.1.1 通过实例理解IoC的概念 3.1.2 IoC的类型 3.1.3 通过容器完成依赖关系的注入 3.2 相关Java基础知识 3.2.1 简单实例 3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 ...

    net学习笔记及其他代码应用

    引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 [Page] 39.启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机...

    c#经典读物:C#经典范例50讲

    C#中接口(interface)的理解. 17 DotNet(C#)学习-你学到什么程度!. 20 C# 2.0 套接字编程实例初探. 06 Word文档中快速插入分隔线的技巧. 11 C# 4.0语言将出现重大改变,带来一段Code. 11 C# 3.0新特性初步研究

    Delphi5开发人员指南

    1.5 创建一个简单的应用程序 11 1.6 事件机制的优势在哪里 12 1.7 加速原型化 13 1.8 可扩展的组件和环境 13 1.9 IDE最重要的十点功能 13 1.10 总结 15 第2章 Object Pascal语言 16 2.1 注解 16 2.2 新的过程和函数...

    外文翻译 stus MVC

    1:外文原文 Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology....

    自己动手写操作系统(含源代码).part2

    在读完本书后,你不但可以获得对于操作系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式,以及操作系统整体上的框架都将会有一定程度的了解。 笔者相信,当你读完本书之后,如果再读那些纯理论性的操作...

    自己动手写操作系统(含源代码).part1

    在读完本书后,你不但可以获得对于操作系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式,以及操作系统整体上的框架都将会有一定程度的了解。 笔者相信,当你读完本书之后,如果再读那些纯理论性的操作...

    复旦nois教材01.rar

    1 第一章 绪论....................................................................................................................................1 1.1 概述................................................

Global site tag (gtag.js) - Google Analytics