了解接口,主要是为了一道经典面试题:接口与抽象类的区别,对接口的理解却很少,现在学习一下。

接口只包含方法、属性、事件或索引器的签名。成员的实现是在实现接口的类或结构中完成的。

Interface
namespace study1124
{
    interface ISampleInterface
    {
        void SampleMethod();
    }
    class InterFace:ISampleInterface
    {
        void ISampleInterface.SampleMethod()
        {
            Console.WriteLine("My InterFace");
        }
        static void Main()
        {
            ISampleInterface obj = new InterFace();
            obj.SampleMethod();
            Console.ReadKey();
        }
    }
}

接口可以是命名空间或类的成员,并且可以包含下列成员的签名:方法,属性,索引器,事件。

一个接口可以从一个或多个基接口继承。

当基类型列表包含基类和方法时,基类必须是列表中的第一项。

实现接口的类可以显式实现该接口的成员。显示实现的成员不能通过类实例访问,而只能通过接口实例访问。

小实例:接口包含属性声明,类包含实现。

Interface
namespace study1124
{
    interface IPoint
    {
        int x
        {
            get;
            set;
        }
        int y
        {
            get;
            set;
        }
    }

class Point : IPoint
    {
        private int _x;
        private int _y;
        public Point(int x, int y)
        {
            _x = x;
            _y = y;
        }

public int x
        {
            get
            {
                return _x;
            }
            set
            {
                _x = value;
            }
        }
        public int y
        {
            get
            {
                return _y;
            }
            set
            {
                _y = value;
            }
        }
    }
    class MainClass
    {
        static void PrintPoint(IPoint p)
        {
            Console.WriteLine("x={0},y={1}",p.x,p.y);     
        }
        static void Main()
        {
            Point point = new Point(2, 3);
            Console.Write("My Point:");
            PrintPoint(point);
            Console.ReadKey();
        }
    }
}

显式接口实现:

如果类实现两个接口,并且这两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为他们的实现。如:

Interface
interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method.
    public void Paint()
    {
    }
}

然而,如果两个接口成员执行不同的函数,那么这可能会导致其中一个接口的实现不正确或两个接口的实现都不正确。可以显式地实现接口成员,即创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的。

Code
public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

网上看到一段话,很不错:http://bbs.51aspx.com/showtopic.aspx?topicid=10429&forumpage=1

主要内容如下:

1. 面向接口编程和面向对象编程是什么关系

首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分。或者说,它是面向对象编程体系中的思想精髓之一。
2. 接口的本质

接口,在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。它在形式上,可能是如下的样子:

interface InterfaceName
{
    void Method1();
    void Method2(int para1);
    void Method3(string para2,string para3);
}
那么接口的本质是什么呢?

1) 接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
2)接口是在一定粒度视图上同类事物的抽象表示。注意这里我强调了在一定粒度视图上,因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。
3. 面向接口编程综述

面向接口编程:在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
这样做的好处是显而易见的,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,就像我们将一个WD的60G硬盘换成一个希捷的160G的硬盘,计算机其他地方不用做任何改动,而是把原硬盘拔下来、新硬盘插上就行了,因为计算机其他部分不依赖具体硬盘,而只依赖一个IDE接口,只要硬盘实现了这个接口,就可以替换上去。从这里看,程序中的接口和现实中的接口极为相似,所以我一直认为,接口(interface)这个词用的真是神似!
使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,就像造硬盘的不用等造CPU的,也不用等造显示器的,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。

转载于:https://www.cnblogs.com/niuniu1985/archive/2009/11/24/1609414.html

接口学习笔记(2009.11.24)相关推荐

  1. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  2. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  3. 《游戏设计艺术(第2版)》——学习笔记(11)第11章 玩家的动机驱使着玩家的脑

    <游戏设计艺术(第2版)>学习笔记(11) 第11章 玩家的动机驱使着玩家的脑 需求 更多需求 内在动机.外在动机 想做与得做 创新 评断 第11章 玩家的动机驱使着玩家的脑 我们先来面对 ...

  4. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  5. C# 学习笔记(11)蓝屏小工具

    C# 学习笔记(11)蓝屏小工具 加载界面参考 C# Winform 现代化扁平化启动界面设计https://www.bilibili.com/video/BV17E41147wM PS做一张图 70 ...

  6. 深度学习笔记(11) 超参数调试

    深度学习笔记(11) 超参数调试 1. 选择合适的范围 2. 超参数调试实践 1. 选择合适的范围 关于训练深度最难的事情之一是要处理的参数的数量 学习速率 a 到 Momentum(动量梯度下降法) ...

  7. Java自学.接口学习笔记!

    接口学习笔记 文章目录 接口学习笔记 1.接口的概述与生活中的举例 2.接口定义的基本格式 3.接口的抽象方法 3.1接口抽象方法的定义 3.2接口的抽象方法使用 4.接口的默认方式 4.1接口的默认 ...

  8. Jenkins持续集成学习笔记(2020.11.22)

    Jenkins持续集成学习笔记(2020.11.22) 前言: (官网) 以前很久学习过Jenkins持续集成进行快速部署项目进行测试, 最近换工作了, 发现新公司有用到, 现在来复习一下 官网介绍: ...

  9. 阿里云Apsara Clouder专项技能认证-实现调用API接口-学习笔记

    Apsara Clouder专项技能认证-实现调用API接口-学习笔记 阿里云的一个小认证,闲来无事,考一下 一.API简介 API的概念 API(Application Programming In ...

最新文章

  1. C#中父子窗口之间实现控件互操作
  2. 2016大一计算机基础操作题,2016大学计算机基础试题及答案
  3. jdeveloper_适用于JDeveloper 11gR2的Glassfish插件
  4. Docker实践:Cannot connect to the Docker daemon.
  5. BZOJ2005 NOI2010 能量采集 欧拉函数
  6. 计算机软考培训网校,计算机软考培训中心
  7. nlp论文-《Neural Machine Translation by Jointly Learning to Align and Translate》-基于联合学习对齐和翻译的神经机器翻译(一)
  8. Linux常用的查看设备的命令
  9. Fit项目分页组件的编写
  10. 互联网高可用架构技术实践
  11. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告
  12. dbvisualizer连接达梦_Dbvisualizer怎么使用,Dbvisualizer使用教程解析
  13. zul ajax使用线程池
  14. 2021-07-13网络术语解释
  15. 微信小程序:2022虎年全新头像框制作
  16. WEB前端性能优化,提高页面加载速度
  17. 【数据结构_选择题】(D21 0519)
  18. 自行实现ONVIF协议网络摄像机(IPC)开发(0):专栏开篇
  19. 【安卓】近场通信技术分析
  20. 官方:“四个放宽”、“三个加强”安置退役军人

热门文章

  1. 动手扩充FreeTextBox的功能
  2. Linux socket 网络编程 常用头文件
  3. C++中标准模板库std::vector的实现
  4. linux系统用户属组,关于 Linux系统用户、组和权限管理
  5. qq浏览器网页翻译_科研利器 | NCBI网站影响因子与网页翻译插件安装指南
  6. 进程 线程 协程_进程,线程,协程那些事
  7. python栈溢出_Python栈溢出【新手必学】
  8. Java学习总结:36(日期处理类)
  9. Java项目:智能制造生产管理平台(java+SSM+mysql+Maven+Easyui+JSP)
  10. runaway深度递归函数测试及相关汇编指令