首页 > 编程语言 >C#——接口

C#——接口

时间:2023-11-10 13:55:41浏览次数:34  
标签:HandRod Console C# 接口 class FisherMan public

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

接口定义协定。 实现接口的类或结构必须遵循它的协定。 接口可以从多个基接口继承,类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。 接口本身不提供它定义的成员的实现。 接口仅指定实现接口的类或结构必须提供的成员。

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

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

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

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

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

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

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

这么多也基本够用;

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

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

这里涉及到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 的魅力了吗?

欢迎留言与评论...

标签:HandRod,Console,C#,接口,class,FisherMan,public
From: https://www.cnblogs.com/StephenYoung/p/17823811.html

相关文章

  • CodeForces 852C Property
    洛谷传送门CF传送门NOIP模拟赛T1,小清新几何题。要让选出的点组成的多边形面积最大,就要让正多边形的面积减去选出的点组成的多边形面积最小。而这个面积差可以表示成\(2n\)个三角形的面积,即\(\sum\limits_{i=0}^{2n-1}S_{\triangleA_iA_{(i+1)\bmodn}B_{(i+......
  • mysql 查询报错Expression #1 of SELECT list is not in GROUP BY clause and contain
    这个错误是由于MySQL的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在GROUPBY语句中的SELECT列表中,只能包含分组或聚合函数,不能包含其他列。而你的查询语句中出现了一个列senior_two.score.student_id,它既没有被分组也没有被聚合,因此MySQL报出了这个错误。5.7版本以下不......
  • Adding Conditional Control to Text-to-Image Diffusion Models
    https://mp.weixin.qq.com/s/iL6YitT7EGP6DnrBehb9MQ1.AddingConditionalControltoText-to-ImageDiffusionModels论文地址:https://arxiv.org/pdf/2302.05543.pdf开源地址:https://github.com/lllyasviel/ControlNet(该项目已有2.4万stars)作者单位:斯坦福大学这......
  • 无涯教程-批处理 - Batch Files – Pipes函数
    管道运算符(|)获取一个命令的输出(默认为STDOUT),并将其定向到另一命令的输入(默认为STDIN),如,以下命令对目录C:\的内容进行排序dirC:\|sort在此示例中,两个命令同时启动,但随后sort命令暂停,直到收到dir命令的输出,sort命令使用dir命令的输出作为输入,然后将其输出发送到句柄1(即S......
  • Solutions to desertification
    As globaltemperaturesrise andthe humanpopulation expands,moreoftheplanetisvulnerabletodesertification,thepermanentdegradationoflandthatwasoncearable.Whilelanddegradationhasoccurredthroughouthistory,thepacehasaccelerated,rea......
  • A solution to desertification
    Whatisdesertification?Desertification,theprocessbywhichnaturalorhumancausesreducethebiologicalproductivityof drylands (aridandsemiaridlands).Declinesinproductivitymaybetheresultof climatechange, deforestation,overgrazing, pov......
  • 使用rancher rke快速安装k8s集群
    概述RancherKubernetesEngine(RKE)是一个用于部署、管理和运行Kubernetes集群的开源工具。旨在简化Kubernetes集群的部署和操作。RKE具有以下特点和功能:简化的部署过程RKE提供了一个简单的命令行界面,使您可以轻松地部署一个完整的Kubernetes集群。您只需提供少量的配置信息,RKE......
  • 以下代码执行后,输出结果为 抛出ReferenceError
    letx=10;letfoo=()=>{console.log(x);letx=20;x++;}foo();使用let声明的变量,既不会发生变量提升,同时又存在“暂时性死区”,所以在块级作用域内,如果使用let声明一个变量,那么该变量在声明之前是不可用的,否则会抛出ReferenceError异常一楼的回答说:”l......
  • Oracle常用SQL-处理异常锁表
    锁表查询的代码有以下的形式:selectcount(*)fromv$locked_object;select*fromv$locked_object;查看哪个表被锁selectb.owner,b.object_name,a.session_id,a.locked_mode,a.object_idfromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id;查看是哪个ses......
  • JavaScript的BOM和document编程方法汇总和实例-----前端
    //总结浏览器往服务器发请求          //表单,超链接          //document.location文本重定向          //window.location窗口重定向          //window.open()请求地址       ......