当前位置: 首页 > 编程日记 > 正文

接口学习笔记(2009.11.24)

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

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

ContractedBlock.gifExpandedBlockStart.gifInterface
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();
        }
    }
}

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

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

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

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

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

ContractedBlock.gifExpandedBlockStart.gifInterface
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(23);
            Console.Write(
"My Point:");
            PrintPoint(point);
            Console.ReadKey();
        }
    }
}

显式接口实现:

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

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

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

ContractedBlock.gifExpandedBlockStart.gifCode
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

相关文章:

“一网打尽”Deepfake等换脸图像,微软提出升级版鉴别技术Face X-Ray​

作者 | Just出品 | AI科技大本营(ID:rgznai100)Deepfake换脸图像的泛滥给人类社会带来了巨大的挑战。虽然研究者们为检测换脸图片提出了多种AI鉴别算法,但随着换脸算法的不断改造升级,鉴别算法很难跟上换脸算法的变化。微软亚洲研…

双边滤波算法的简易实现bilateralFilter

没怎么看过双边滤波的具体思路,动手写一写,看看能不能突破一下。 最后,感觉算法还是要分开 水平 与 垂直 方向进行分别处理,才能把速度提上去。 没耐性写下去了,发上来,给大伙做个参考好了。 先上几张效果图…

赔偿谷歌1.8亿美元!前Uber自动驾驶主管被告到破产

整理 | Just出品 | AI科技大本营(ID:rgznai100)两年前的Google自动驾驶部门与Uber自动驾驶技术纠纷案以和解结束后再起波澜。据路透社等外媒报道,Uber自动驾驶部门前主管安东尼莱万多夫斯基(Anthony Levandowski)周三申…

.data和.text段合并

a.c #include <stdio.h> extern int share;int main(void) { int a100;swap(&a,&share);} b.c int share1;void swap(int *a,int *b){*a^*b^*a^*b;} 编译 #gcc -c a.c b.c 链接 #ld a.o b.o -e main -o ab 查看 #objdump -h 文件 VMA即虚拟地址 size即…

用QQ提问的技巧,用了之后可以提高效率,呵呵。

有些Tx喜欢用QQ向好友提些问题&#xff0c;但是却没有掌握提问的技巧&#xff0c;自己没有及时得到答案也浪费了对方的时间。这里抛砖引玉&#xff0c;说一下我的看法和体会。大家一起讨论。我们讨论问题&#xff0c;不讨论人。 一、 把QQ当成了电话&#xff08;不适合的做法&a…

Android重绘ListView高度

Android重绘ListView高度 经常会有这样需求&#xff0c;需要ListView默认将所有的条目显示出来&#xff0c;这就需要外层使用ScrollView&#xff0c;ScrollView里面放置一个重绘高度的ListView&#xff0c;类似下面这样 工具类 package ……;import android.view.View; import …

C语言数据类型所占空间大小

C语言数据类型所占空间大小 /** datasize.c -- print the size of common data items* This runs with any Linux kernel (not any Unix, because of <linux/types.h>)** Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet* Copyright (C) 2001 OReilly & A…

SharePoint基础之六- SharePoint基础架构中涉及的ASP.NET架构

ASP.NET框架代表着在IIS和ISAPI编程模型之上的一个重要的生产力层. 如果你熟悉ASP.NET开发的话, 你就会知道它为你的应用程序逻辑编写托管代码提供了便利, 比如说C#, VB.NET, 并且允许你在由Microsoft Visual Studio提供的面向生产力的可视化编辑器中工作. ASP.NET框架还提供了…

Javascript函数之深入浅出递归思想,附案例与代码!

作者 | 浮世万千吾爱有三责编 | Carol来源 | CSDN 博客递归函数的理解1、生活中的递归“递归”在生活中的一个典例就是“问路”。如图小哥哥进入电影院后找不到自己的座位&#xff0c;问身边的小姐姐“这是第几排”&#xff0c;小姐姐也不清楚便依次向前询问&#xff0c;问至第…

Linux指令--文件和目录属性

对于每一个Linux学习者来说&#xff0c;了解Linux文件系统的目录结构&#xff0c;是学好Linux的至关重要的一步.&#xff0c;深入了解linux文件目录结构的标准和每个目录的详细功能&#xff0c;对于我们用好linux系统只管重要&#xff0c;下面我们就开始了解一下linux目录结构的…

Linux内存寻址

一.内存地址分类以及MMU介绍 对于程序员来说&#xff0c;可以简单的把内存地址理解为一种访问存储单元的内容的一种方式。而对于80x86系列微处理器来说&#xff0c;我们需要区分三种地址&#xff1a; &#xff08;1&#xff09;逻辑地址 这种地址通常使用在机器语言里用于指…

iptables 基本命令使用举例

原文地址&#xff1a;http://www.linuxsky.org/doc/admin/200803/262.html 一、链的基本操作 1、清除所有的规则。 1&#xff09;清除预设表filter中所有规则链中的规则。 # iptables -F 2&#xff09;清除预设表filter中使用者自定链中的规则。 #iptables -X #iptables -Z 2、…

重磅!教育部再次审批179所高校新增本科AI专业

整理&责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;好消息&#xff01;2 月 21 日&#xff0c;教育部官网发布了《教育部关于公布 2019 年度普通高等学校本科专业备案和审批结果的通知》&#xff0c;公开了 2019 年度普通高等学校本科专业备案和审批结果。17…

Qt之自定义搜索框

简述 关于搜索框&#xff0c;大家都经常接触。例如&#xff1a;浏览器搜索、Windows资源管理器搜索等。 当然&#xff0c;这些对于Qt实现来说毫无压力&#xff0c;只要思路清晰&#xff0c;分分钟搞定。 简述效果细节分析Coding源码下载效果 细节分析 实现细节需要如下步骤&…

大型网站架构演变和知识体系

存爱好&#xff0c;作为收藏&#xff0c;原地址&#xff1a;http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html&#xff0c;同时向原创致敬之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#…

Python数据清理终极指南(2020版)

作者 | Lianne & Justin译者 | 陆离出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一般来说&#xff0c;我们在拟合一个机器学习模型或是统计模型之前&#xff0c;总是要进行数据清理的工作。因为没有一个模型能用一些杂乱无章的数据来产生对项目有意义的结果。…

内存地址转换与分段

原文标题&#xff1a;Memory Translation and Segmentation 原文地址&#xff1a;http://duartes.org/gustavo/blog/ 翻译地址&#xff1a;http://blog.csdn.net/drshenlei/article/details/4261909 本文是Intel兼容计算机&#xff08;x86&#xff09;的内存与保护系列文章的第…

c++ 普通高精减

//c 普通高精减 //codevs 3115 高精度练习之减法 //内容简单&#xff0c;就不注释了。 //注意下&#xff0c;&&优先级高于||。 #include<cstdio>#include<cstring>char s1[600],s2[600];int a1[600],a2[600],len1,len2,i;int main(){scanf("%s",…

腾讯提超强少样本目标检测算法,公开1000类检测训练集FSOD | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记不同于正常的目标检测任务&#xff0c;few-show目标检测任务需要通过几张新目标类别的图片在测试集中找出所有对应的前景。为了处理好这个任务&#xff0c;论文主要有两个贡献&#xff1a;提出一个通用的few-show目标检测算法&#…

Linux加入到Windows域 收藏

一、实验环境&#xff1a; AD server&#xff1a;windows server 2003samba&#xff1a;redhat as5AD server的hostname和IP地址&#xff1a;turbomai-c<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" />89f91.test.com 192…

哈希函数原理及实现

哈希解决冲突 1000以内的素数 一般的hash实现已经总结出一些比较重要的素数&#xff1a; static unsigned int table_size[] {7,13,31, 61, 127, 251, 509, 1021,2039, 4093, 8191, 16381, 32749, 65521,1310…

基于Virtual DOM与Diff DOM的测试代码生成

尽管是在年末&#xff0c;并且也还没把书翻译完&#xff0c;也还没写完书的第一稿。但是&#xff0c;我还是觉得这是一个非常不错的话题——测试代码生成。当我们在写一些UI测试的时候&#xff0c;我们总需要到浏览器去看一下一些DOM的变化。比如&#xff0c;我们点击了某个下拉…

Win32 环境下的堆栈

原文已经找不到&#xff0c;作者应该是&#xff1a;http://blog.csdn.net/slimak 但是没有找到此文&#xff0c;其中丢了2幅图 简介 在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack)打交道,尤其是在需要手工遍历堆栈(Manually Walking Stack)的时候我们需要…

在VMWare中配置SQLServer2005集群 Step by Step(四)——集群安装

在VMWare 中配置集群 1. 进入command 命令窗口执行以下命令&#xff0c;创建仲裁磁盘和共享数据磁盘 vmware-vdiskmanager.exe -c -s 200Mb -a lsilogic -t 2 F:\VM\Share\Windows\SQLServer\quorum.vmdk vmware-vdiskmanager.exe -c -s 4Gb -a lsilogic -t 2 F:\VM\Share\Wind…

口罩检测识别率惊人,这个Python项目开源了

作者 | 一颗小树x&#xff0c;CSDN 博主编辑 | 唐小引来源 | CSDN 博客昨天在 GitHub 上看到一个有趣的开源项目&#xff0c;它能检测我们是否有戴口罩&#xff0c;跑起程序测试后&#xff0c;发现识别率挺高的&#xff0c;也适应不同环境&#xff0c;于是分享给大家。首先感谢…

CentOS搭建msmtp+mutt实现邮件发送

1&#xff1a;搭建配置msmtp下载msmtp包&#xff1a;官方地址&#xff1a;http://msmtp.sourceforge.net/download.html编译&#xff0c;安装(官方下载的包为tar.xz格式):#xz -d msmtp-1.6.3.tar.xz #tar -xvf msmtp-1.6.3.tar #cd msmtp-1.6.3 #./configure --prefix /opt/app…

Linux环境下的堆栈--调试C程序

完整的调试过程&#xff0c;跟踪堆栈变化&#xff0c;32位下。 注意64位和此不同。 a.c代码&#xff1a; #include <stdio.h> int main() { AFunc(5,6);return 0; } int BFunc(int i,int j) {int m 1;int n 2;m i;n j; return m; }int AFunc(int i,int j) {…

听说过代码洁癖,Bug洁癖怎么解?

来源 | Python编程时光&#xff08;ID: Cool-Python&#xff09;当我们写的一个脚本或程序发生各种不可预知的异常时&#xff0c;如果我们没有进行捕获处理的时候&#xff0c;通常都会致使程序崩溃退出&#xff0c;并且会在终端打印出一堆 密密麻麻 的 traceback 堆栈信息来告诉…

POJO、VO、PO、FormBean区别:

首先讲一下四者的概念 POJO&#xff1a;Pure Old Java Object&#xff0c;符合Java Bean属性规范的简单Java对象&#xff0c;通常也称为VO&#xff08;Value Object&#xff0c;值对象&#xff09;。 VO&#xff1a;就是POJO; PO: Persistent Object&#xff0c;持久化对…

oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen

Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type) is begindelete from dept where deptnop_deptno;dbms_output.put_line(部门删除成功...);exception when others thendbms_output.put_lin…