先来看看微软官方对接口的定义与说明。

接口定义协定。 实现接口的类或结构必须遵循它的协定。 接口可以从多个基接口继承,类或结构可以实现多个接口。

接口可以包含方法、属性、事件和索引器。 接口本身不提供它定义的成员的实现。 接口仅指定实现接口的类或结构必须提供的成员。

对于这种官方的文档,我相信大部分都看得头大,看了一遍,等于没看,这也就是学习新知识的一个正常现象。

那么我来通俗来讲讲我的个人理解:

1,所谓接口,某种意义上来说也就是类似客户和供应商直接的一个合同约定,客户在用的时候按照约定内容来使用,供应商来按照约定的内容来提供;这样依赖大大降低了程序的耦合性,所谓“耦合性”,就是指的程序内部相互勾连的部分多少,多就是耦合性高,相互依赖性强;反之,即是低耦合性。

2,接口可以 作为字段成员;

3,接口可以继承自其他接口,并且可以多继承;

4,接口可以让类继承自它,然后类体必须对接口进行实现:换成人话就是,接口里有个空的特殊方法,这个特殊方法不可以单独执行,没有方法体,现在既然有类继承于这个接口,那么编译器就要求此类必须来把这个方法写完整,方法名必须一模一样;

5,还有其他的,暂时编不下去了。。。。

嗯~ o( ̄▽ ̄)o这么多也基本够用了;

啰啰嗦嗦这么多,不如咱们来

举一个人来钓鱼的场景吧!

这里涉及到2个类:

1. 钓鱼人:FisherMan

2. 鱼竿——手竿:HandRod

先看不用接口的情况,强依赖。

namespace FisherMan
{
class Program
{
static void Main(string[] args)
{
FisherMan fisherMan = new FisherMan(new HandRod());
fisherMan.GoFish(); Console.ReadLine();
}
} class FisherMan
{
HandRod _handRod;//类的字段
public FisherMan(HandRod handRod)//构造函数,钓鱼人得有个钓鱼竿吧
{
_handRod = handRod;
}
public void GoFish() {//钓鱼人的方法
Console.WriteLine(_handRod.Fish()+"今天,我跋山涉水去钓鱼。");
}
}
class HandRod
{
public string Fish() {
return "我用手竿,最多抛出去20米。";
}
}
}

运行结果:

接下来,使用接口:

假设现在要有有个 一个 海杆儿,怎么办?我在增加一个 海杆儿 类,再在Main主程序里修改调用海杆儿的示例。虽然这样也没毛病,能实现,但会返现我不仅要改类体,还要改其调用的地方;违反类设计的开闭原则。

此时如果我们引入类的接口,创建一个接口,用这个接口作为FisherMan的字段声明;HandRod 和 SeaRod 两个类均作为这个接口的实现;

上代码,注意里面的注释:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace FisherMan
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("第一种:");
FisherMan fisherMan = new FisherMan(new HandRod());
fisherMan.GoFish(); Console.WriteLine("第二种:");
fisherMan = new FisherMan(new SeaRod());
fisherMan.GoFish(); Console.WriteLine("\r\n\r\n可以观察到以上两种情况下,我们都无须修改类体代码,实现了解耦!");
Console.ReadLine();
}
}
interface IRod
{
string Fish();
}
class FisherMan
{
IRod _Rod;//类的字段,接口类型
public FisherMan(IRod Rod)//构造函数,钓鱼人得有个钓鱼竿吧,此处用接口类型作为方法签名
{
_Rod =Rod;
}
public void GoFish() {//钓鱼人的方法
Console.WriteLine(_Rod.Fish()+"今天,我跋山涉水去钓鱼。");
}
}
class HandRod:IRod
{
public string Fish() {
return "我用手竿,最多抛出去20米。";
}
}
class SeaRod : IRod
{
public string Fish()
{
return "我用海杆儿,最多抛出去100米。";
}
}
}

运行结果:

好了,先说到这里吧。小伙伴们,Get到了Interface 的魅力了吗?

雁过留痕,人过留言...

如果对您的学习与理解有那么一丝丝帮助,或者您发现哪里有错误。

欢迎评论与分享...

C#——接口的更多相关文章

  1. C#类型的转换:Converter<TInput, TOutput> 委托的使用

    Converter<TInput, TOutput> 委托 表示将对象从一种类型转换为另一种类型的方法. 此委托由 Array 类的 ConvertAll<TInput, TOutp ...

  2. Array.ConvertAll<TInput, TOutput> 数组相互转化方法

    有个需求,把char数组转换为int数组,然后噼里啪啦就弄了这样一堆代码: public static int[] CharArrToIntArr(char[] charArr) { int[] in ...

  3. C#高级编程笔记 Day 5, 2016年9月 13日 (泛型)

    [重点]泛型:有了泛型,就可以创建独立于被包含类型的类和方法了.我们不必给不同的类型编写功能相同的许多方法和类,只创建一个方法或类即可,以下是泛型的特点:性能.类型安全性.二进制代码重用.代码的扩展. ...

  4. 最近面试的题目(WEB、Service、SQL、JavaScript)

    整理一下最近面试被问到的主要题目.由于本人主要是做WEB及WEB SERVICE这块,使用的语言主要是C#,数据库主要用到的也是MSSQL.所以就分成这些块来整理(有些是在面试之后才意识到回答不对), ...

  5. C#集合--数组

    Array类是所有一维和多维数组的隐式基类,同时也是实现标准集合接口的最基本的类型.Array类实现了类型统一,因此它为所有数组提供了一组通用的方法,不论这些数组元素的类型,这些通用的方法均适用. 正 ...

  6. 使用 IL 实现类型转换

    在之前的文章中,我大致介绍过一些类型间的隐式和显式类型转换规则.但当时并未很仔细的研究过<CSharp Language Specification>,因此实现并不完整.而且只部分解决了类 ...

  7. C#泛型(C#_编程指南)CSDN学习整理笔记

    1.1. 泛型概述 2.0版C#语言和公共语言运行时(CLR)中增加了泛型.泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定 ...

  8. 关于C#泛型列表List<T>的基本用法总结

    //示例代码如下:using System;using System.Collections.Generic;using System.Collections.ObjectModel;namespac ...

  9. Linq/List/Array/IEnumerable等集合操作

    来源:http://www.cnblogs.com/liushanshan/archive/2011/01/05/1926263.html 目录 1    LINQ查询结果集    1 2    Sy ...

  10. C#集合基础与运用

    C#集合基础与运用   C#集合基础与运用 1. 集合接口与集合类型............................................... 1 (1) 集合的命名空间..... ...

随机推荐

  1. ShareConnect即将寿终正寝 Splashtop远程桌面会是最好的替代品

    大家好,我是没有感情的翻译机器人,又见面了.同类产品ShareConnect即将退市,官方大大搞了个新闻稿.君叫臣翻,臣不得不翻.------没有感情的分割线------ShareConnect的使用 ...

  2. .NET 9 预览版:打造云原生及人工智能 AI 平台

    前言 微软发布了 .NET 9 首个预览版,分享.NET团队对 .NET 9 的初步愿景,该愿景将于今年年底在 .NET Conf 2024 上发布. 重点关注针对云原生和人工智能领域的应用程序开发以 ...

  3. Sass预处理器 常见函数的基本使用

    Sass提供了许多内置模块,其中包含有用的函数(以及mixin).这些模块可以像任何用户定义的样式表一样使用@use规则加载,它们的函数可以像任何其他模块成员一样调用.所有内置模块URL都以sass开 ...

  4. Vue——安装

    Vue.js 设计的初衷就包括可以被渐进式地采用.这意味着它可以根据需求以多种方式集成到一个项目中. 将 Vue.js 添加到项目中主要有四种方式: 1.在页面上以 CDN 包的形式导入. <s ...

  5. Ubuntu Server LTS 修改网卡ip地址、固定IP

    Ubuntu Server LTS 修改网卡ip地址方式.固定IP. 18.04 之前版本通过修改/etc/network/interfaces 方式,18.04 版本开始通过netplan 方式: ...

  6. Spring AOP 中@Pointcut的用法(多个Pointcut)

    Spring AOP 中@Pointcut的用法(多个Pointcut) /** swagger切面,分开来写 **/ @Aspect @Component public class ApiOpera ...

  7. 幻想领域图床系统V1.2正式版发布

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 幻想领域图床系统V1.2正式版发布 日期:2018-4-1 ...

  8. 实现 Emlog 最新评论列表不显示博主的评论回复

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 实现 Emlog 最新评论列表不显示博主的评论回复 日期: ...

  9. 探索Semantic Kernel内置插件:深入了解ConversationSummaryPlugin的应用

    前言 经过前几章的学习我们已经熟悉了Semantic Kernel 插件的概念,以及基于Prompts构造的Semantic Plugins和基于本地方法构建的Native Plugins.本章我们来 ...

  10. uniapp ios 白屏

    这个问题找了两天,问题出现的很离谱代码编译没问题,安卓.ios真机运行也没问题,打包以后安卓没问题,iphone 12(ios16.6.1)安装也没问题,还有一个iphone 6s(ios14.7.1 ...