C#学习之接口

2023-05-16

  什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致。个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的。注意,虽然在概念上,C#接口类似于COM接口,但他们的底层结构是不同的。那么,我们来看一下如何声明和使用接口。

   声明接口

  声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口:
  
public   interface  IBankAccount
{
    
void  PayIn( decimal  amount);
    
bool  Withdraw( decimal  amount);

    
decimal  Balance
    {
        
get ;
    }
}

  注意:接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。

   使用接口的例子

  这是书上的一个简单的例子,但足以说明接口的使用方法。
  一个银行账户的接口,两个不同银行账户的实现类,都继承于这个接口。接口声明如上。下面是两个账户类:

class  SaverAccount : IBankAccount
{
    
private   decimal  balance;

    
public   decimal  Balance
    {
        
get  
        {
            
return  balance;    
        }
    }

    
public   void  PayIn( decimal  amount)
    {
        balance 
+=  amount;
    }

    
public   bool  Withdraw( decimal  amount)
    {
        
if  (balance  >=  amount)
        {
            balance 
-=  amount;
            
return   true ;
        }
        Console.WriteLine(
" Withdraw failed. " );
        
return   false ;
    }

    
public   override   string  ToString()
    {
        
return  String.Format( " Venus Bank Saver:Balance={0,6:C} " , balance);
    }
}

class  GoldAccount : IBankAccount
{
    
private   decimal  balance;

    
public   decimal  Balance
    {
        
get  
        {
            
return  balance;
        }
    }

    
public   void  PayIn( decimal  amount)
    {
        balance 
+=  amount;
    }

    
public   bool  Withdraw( decimal  amount)
    {
        
if  (balance  >=  amount)
        {
            balance 
-=  amount;
            
return   true ;
        }
        Console.WriteLine(
" Withdraw failed. " );
        
return   false ;
    }

    
public   override   string  ToString()
    {
        
return  String.Format( " Jupiter Bank Saver:Balance={0,6:C} " , balance);
    }
}

  可见,这两个实现类多继承了IBankAccount接口,因此它们必须要实现接口中的所有声明的方法。要不然,编译就会出错。让我们来测试一下,下面是测试代码:

static   void  Main( string [] args)
{
    IBankAccount venusAccount 
=   new  SaverAccount();
    IBankAccount jupiterAccount 
=   new  CurrentAccount();
    venusAccount.PayIn(
200 );
    jupiterAccount.PayIn(
500 );
    Console.WriteLine(venusAccount.ToString());
    jupiterAccount.PayIn(
400 );
    jupiterAccount.Withdraw(
500 );
    jupiterAccount.Withdraw(
100 );
    Console.WriteLine(jupiterAccount.ToString());

}

  请注意开头两句,我们把它们声明为IBankAccount引用的方式,而没有声明为类的引用,为什么呢?因为,这样我们就可以让它指向执行这个接口的任何类的实例了,比较灵活。但这也有个缺点,如果我们要执行不属于接口的方法,比如这里重载的ToString()方法,就要先把接口的引用强制转换成合适的类型了。

   接口的继承

  接口也可以彼此继承,就象类的继承一样。比如我们又声明一个接口ITransferBankAccount,它继承于IBankAccount接口。

interface  ITransferBankAccount : IBankAccount 
{
    
bool  TransferTo(IBankAccount destination,  decimal  amount);
}

  在这个接口中,又新增加了一个方法TransferTo(),所以如果我们要写一个类从ITransferBankAccount继承的话,就必须要实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。即:

None.gif class  CurrentAccount : ITransferBankAccount
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
private decimal balance;
InBlock.gif
InBlock.gif    
public decimal Balance
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
get
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return balance;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public void PayIn(decimal amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        balance 
+= amount;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public bool Withdraw(decimal amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (balance >= amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            balance 
-= amount;
InBlock.gif            
return true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        Console.WriteLine(
"Withdraw failed.");
InBlock.gif        
return false;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public override string ToString()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return String.Format("Jupiter Bank Saver:Balance={0,6:C}", balance);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public bool TransferTo(IBankAccount destination, decimal amount)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (Withdraw(amount))
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            destination.PayIn(amount);
InBlock.gif            
return true;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
return false;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

  总结起来说,使用C#接口应注意几个问题:

  1、C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。

  2、接口和类都可以继承多个接口。

  3、类可以继承一个基类,接口根本不能继承类。这种模型避免了 C++的多继承问题,C++中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制。C#的简化接口模型有助于加快应用程序的开发。

  4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。

  5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。

 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#学习之接口 的相关文章

  • Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Uncaught DOMException Failed to execute 39 toDataURL 39 on 39 HTMLCanvasElement 39 Tai
  • IO Processing

    Types of IO IRP Buffer Management 首先区分一下page的内存与nonpaged的内存 xff0c 内存如果用页管理 xff0c 就难免面对被swap out的命运 xff1b 但是如果用nonpaged管理
  • Linux 7 系统如何和QQ邮箱通信

    原因 运维工作中 xff0c 当运维的网站或其它出现错误或被攻击时 xff0c 就需要Linux系统将这些提醒信息及时的通知到相应的运维人员 QQ是常用的软件 xff0c 将邮件发送到QQ邮箱可以更容易让运维人员获得提醒的信息 xff08
  • 《Programming in Lua 3》读书笔记(十八)

    日期 xff1a 2014 7 28 Part The Standard Libraries 22 The I O Library Lua的I O库提供了两种不同的文件处理模式 简单模式以I O操作是基于当前的输入文件和输出文件的 xff1
  • The longest class name in Java and .NET Framework

    周末 xff0c 来点轻松的 the longest class name in Java and NET Framework http blogs msdn com junfeng archive 2004 02 06 68337 asp
  • 表单验证之 formik 简单用法

    这里的 formik 版本为 xff1a 34 formik 34 34 1 4 2 34 API jaredpalmer com formik docs formik 是用来构建表单 Formik旨在轻松管理具有复杂验证的表单 Formi
  • docker pull 详解

    docker pull 用于从镜像仓库中拉取或更新指定镜像 xff0c 用法如 xff1a docker pull centos xff0c 默认是从 Docker Hub 中拉取镜像 在拉取镜像前 xff0c 我们可以先配置 docker
  • centos 6.4配置samba+ldap认证

    原文地址 xff1a http www centoscn com image text config 2015 0716 5866 html 1 什么是samba Samba服务类似于windows上的共享功能 xff0c 可以实现在Lin
  • 三因素方差分析_Excel 方差分析的绘图攻略!

    更多内容可关注微信公众号 xff1a 邱宗满 工具可在公众号左下角菜单中下载 目录 1 简介 2 基本区域 3 折线图的基础使用步骤 4 如何隐藏多余图例 5 调整刻度线间距 6 调整刻度线的数字格式 7 调整横轴文字角度 8 设置柱状图的
  • 三菱st语言for_三菱ST学习之FOR循环(从小到大排序)

    一 从小到大排序 通过ST语言 xff0c 将一组乱序的数据 xff0c 按照从小到大的方式排列 1 建立全局标签 2 编写程序 3 程序监控 先进行数组数据赋值 xff0c 这里我们只排列6个数据 xff0c 若想排列更多 xff0c 更
  • python列表逐个输出_在python中打印列表输出的最佳方法

    我有一个列表和这样的列表列表 gt gt gt list2 61 34 1 34 34 2 34 34 3 34 34 4 34 34 5 34 34 6 34 34 7 34 34 8 34 34 9 34 34 10 34 34 11
  • arr取前五个对象 js_JS Array.slice 截取数组的实现方法

    slice定义和用法 slice 方法可从已有的数组中返回选定的元素 语法 arrayObject slice start end 参数 描述 start 必需 规定从何处开始选取 如果是负数 xff0c 那么它规定从数组尾部开始算起的位置
  • MySQL索引失效的原理是什么?

    前言 今天我们讲讲MySQL索引为什么会失效 xff0c 很多文章和培训机构的教程 xff0c 都只会告诉你 xff0c 在什么情况下索引会失效 在讲之前 xff0c 还是先把一些什么情况下索引会失效的结论罗列一下 xff0c 然后大家结合
  • 如何提高项目交付效率

    道法术出自老子 道德经 xff0c 道 xff0c 是规则 自然法则 xff0c 上乘 法 xff0c 是方法 法理 xff0c 中乘 术 xff0c 是行式 方式 xff0c 下乘 以道御术 即以道义来承载智术 xff0c 悟道比修炼法术
  • 注销app密码服务器时出错,苹果7注销id显示验证错误连接服务器出现问题是怎么回事...

    满意答案 创建ID步骤 xff1a 1 在 iPhone 主屏上找到 App Store 图标 xff0c 点击打开 2 打开 App Store 应用商店以后 xff0c 用手指向上滑动 xff0c 点击底部的 登录 按钮 3 在弹出的选
  • js ajax回调 return,js异步回调解决方法

    当一个接口需要依赖另一个接口的请求数据时 1 将请求数据的接口设为同步 xff0c 之后调另一个接口 2 在请求数据接口的成功回调里调另一个接口 但是当一个接口需要依赖很多个接口的请求数据 或者 一个依赖另一个 xff0c 另一个再依赖另一
  • 系统无法请求的服务器地址,没有可用的登录服务器处理地址请求

    没有可用的登录服务器处理地址请求 内容精选 换一换 会话保持 xff0c 指负载均衡器可以识别客户与服务器之间交互过程的关联性 xff0c 在实现负载均衡的同时 xff0c 保持将其他相关联的访问请求分配到同一台服务器上 会话保持有什么作用
  • Iterator接口用法

    1 所有实现Collection接口的容器类都有一个iteractor方法 xff0c 用于返回一个实现了Iteractor接口的对象 xff0c 2 Iteractor对象成为迭代器 xff0c 用以实现对容器内元素的遍历操作 3 Ite
  • 浅析 Hexo 搭建博客的原理

    一直在用 Hexo 写博客 xff0c 但是对其原理并不是很清晰 xff0c 在网上找了一些资料 xff0c 对 Hexo 有了新的认识 xff0c 现在就来记录一下 使用 Hexo 43 github pages 搭建博客 记得刚开始知道
  • c# listView

    使用listView时 xff0c 需要设置单元格背景色 首先设置item UseItemStyleForSubItems 61 false 再通过BackColor来设置 参考 xff1a http www liangshunet com

随机推荐

  • 解决Macbook网络连接成功但是图标一直显示正在查找网络问题

    看图 xff0c 一直显示正在连接网络 明明连接上去了 xff0c 解决办法 xff0c 打开网络偏好设置 新建位置 然后点击应用就搞定了 图标正常了
  • 官网下载到离线的Adobe Acrobat Reader DC

    Adobe 官方 FTP ftp ftp adobe com Adobe Acrobat Reader DC 下载目录 xff1a ftp ftp adobe com pub adobe reader win AcrobatDC 15007
  • Flutter之Dialog使用和踩坑

    简单介绍 最近使用了Flutter的展示对话框的功能 xff0c 踩了一点坑 xff0c 顺便做下总结 xff0c 方便各位以后少踩坑 xff0c 如果有说错的地方 xff0c 还请大家指出来 下面将介绍对话框的几种场景和踩坑 展示普通对话
  • 路径规划之 A* 算法

    算法介绍 A xff08 念做 xff1a A Star xff09 算法是一种很常用的路径查找和图形遍历算法 它有较好的性能和准确度 本文在讲解算法的同时也会提供Python语言的代码实现 xff0c 并会借助matplotlib库动态的
  • MongoDB中yaml模式配配置文件详解

    mongodb3 x版本后就是要yaml语法格式的配置文件 xff0c 下面是yaml配置文件格式如下 xff1a 官方yaml配置文件选项参考 xff1a https docs mongodb org manual configurati
  • java 正则表达式提取字符串

    参考文档 xff1a baijiahao baidu com s id 61 159862 如果需要提取的字符串没有好的规则 xff0c 则直接用点 其他部分剩下的就是自己需要提取的 Pattern p 61 Pattern compile
  • 【成功】qlv转MP4,超简单方法

    1 打开 www xxxbbbttt com 上传你的视频 xff08 腾讯qlv xff0c 爱奇艺qsv 优酷kux xff09 都可以 3 点击转换按钮 xff0c 转换好后 xff0c 我们把转换的视频下载到电脑里 xff0c 就可
  • cisco配置交换机管理地址和默认网关

    配置交换机远程管理地址和默认网关 拓扑图如下 xff1a 1 配置PC0 2 配置SW1交换机 Switch config no ip domain lookup 关闭域名解析 Switch config line exec timeout
  • 兄弟们,请求支援,怎么实现互通,全部都互通的

    转载于 https blog 51cto com 14155986 2337267
  • FIFO算法与LRU算法软考试题

    转载于 https www cnblogs com kungfupanda archive 2009 12 25 1632106 html
  • iOS 网络/本地 图片 按自定义比例缩放 不失真 方法

    我尝试了很多种方法 xff0c 终于 xff0c 设计了一个方法 xff0c 能按自己规定的大小压缩 还没失真 如果以后不好用 我再升级 分享给大家 xff1a 43 CGRect scaleImage UIImage image toSi
  • java 输入输出 函数对象构造

    输入输出 输入字符串 不包括最后的换行符 39 n 39 import java io BufferedReader import java io IOException 输入字符一个char import java io InputStr
  • Python 3 加密简介

    Python 3 的标准库中是没多少用来解决加密的 xff0c 不过却有用于处理哈希的库 在这里我们会对其进行一个简单的介绍 xff0c 但重点会放在两个第三方的软件包 xff1a PyCrypto 和 cryptography 上 xff
  • grep 命令的基本使用

    环境变量 xff1a 定义用户的工作环境某个方面的属性 文本文件的查看命令 xff1a cat 连接 能够将后面跟的多个文件的内容 xff0c 依次显示 cat n 在显示时出现行号 E 显示行结束符 v 显示非打印字符不显示制表符tab
  • innodb Cardinality学习笔记

    github 传送门 链接描述 欢迎过来star呀 背景 1 之前对innodb的Cardinality没概念 xff0c 只知道要高选择性的列上建索引 xff0c 比如用户名而不是性别 xff0c 因为性别区分度不高 xff0c 但是这过
  • K8S组件运行原理详解总结

    一 看图说K8S 先从一张大图来观看一下K8S是如何运作的 xff0c 再具体去细化K8S的概念 组件以及网络模型 从上图 xff0c 我们可以看到K8S组件和逻辑及其复杂 xff0c 但是这并不可怕 xff0c 我们从宏观上先了解K8S是
  • ubuntu中apt-get的常用命令。

    使用以下命令清理系统垃圾 sudo apt get autoclean 清理旧版本的软件缓存 sudo apt get clean 清理所有软件缓存 sudo apt get autoremove 删除系统不再使用的孤立软件 xff1d x
  • Qt之设置QWidget背景色

    简述 QWidget是所有用户界面对象的基类 xff0c 这意味着可以用同样的方法为其它子类控件改变背景颜色 Qt中窗口背景的设置 xff0c 下面介绍三种方法 使用QPalette 使用Style Sheet绘图事件 一般我不用QSS设置
  • 计算机机房英文术语,【数据中心】数据中心常见中英术语及解释

    原标题 xff1a 数据中心 数据中心常见中英术语及解释 一 常见中文术语 1 数据中心 为一个建筑群 建筑物或建筑物中的一个部分 xff0c 主要用于容纳设置计算机房及其支持空间 2 进线间 外部缆线引入和电信业务经营者安装通信设施的空间
  • C#学习之接口

    什么是接口 xff1f 其实 xff0c 接口简单理解就是一种约定 xff0c 使得实现接口的类或结构在形式上保持一致 个人觉得 xff0c 使用接口可以使程序更加清晰和条理化 xff0c 这就是接口的好处 xff0c 但并不是所有的编程语