首页 > 编程语言 >Learning hard C#学习笔记——读书笔记 04

Learning hard C#学习笔记——读书笔记 04

时间:2023-07-18 20:17:03浏览次数:49  
标签:04 读书笔记 C# System 接口 实现 显式 using 抽象类


1.什么是接口


接口可以认为是一种规范,它是一种类的构建规范,它里面定义了一系列的方法和类型,但是没有具体的实现,需要继承它的类去自我实现


2.接口的定义


使用 VS2022 在解决方案管理器这里,添加新建项


在添加新建项模板这里,选择接口


最后创建出来的接口如下


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace classTest
{
    internal interface Interface1
    {
    }
}

接口的注意点

  1. 在接口中定义的方法不能添加任何的修饰符,接口的方法默认是 public
  2. 在接口中可以定义属性、事件、索引器、方法,或者这四类成员的任意组合,但是接口不能包含字段、运算符重载、实例构造函数和析构函数
  3. 接口的所有成员默认都是公共的,不能用public、private、protected来修饰,也不能用static修饰

3.实现接口


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace classTest
{
    public class Person : ICustomCompare
    {
        int age; 
        public int Age { get { return age; } set { age = value; } }



        public int compareTo(object other)
        {
            if (other == null) {
                return 1;
            }

            // 这里强制类型转换一手
            Person value = (Person)other;
            if (value.age > this.age) 
            {
                return -1;
            }
            else
            {
                return 1;
            }

            return 0;
        }
    }
}

using classTest;

class Program
{
    static void Main(string[] args)
    {
        Person p1 = new Person();
        p1.Age = 10;

        Person p2 = new Person();
        p2.Age = 20;

        if (p1.compareTo(p2) > 0)
        {
            Console.WriteLine("p1 > p2");
        }
        else if (p1.compareTo(p2) < 0)
        {
            Console.WriteLine("p1 > p2");
        }
        else {
            Console.WriteLine("一样大");
        }
    } 
}




4.显式的实现接口

之前我们的实现方式是隐式的实现接口的方式,即没有指出是哪个接口的compareTo()方法

而现在是显式的实现方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace classTest
{
    internal interface ICustomCompare
    {
        int compareTo(object other);
    }

    // 中国人打招呼的方式
    internal interface IChineseGreeting 
    {
        void sayHello();
    }

    // 美国人打招呼的方式
    internal interface IAmericanGreeting {
        void sayHello();
    }
}

我们可以发现,上面的代码中,IChineseGreeting、IAmericanGreeting这两个接口,都有sayHello方法,当我们有一个类去实现两个接口的时候,会出现一个问题,就是,我们到底是在实现IChineseGreeting的sayHello()方法,还是在实现IAmericanGreeting的sayHello()方法,还是同时实现?



最后我们发现是两个接口的实现方式都一样,但是如果,我们想要有不同的实现方式,就需要显式的实现接口

下面这种方式就是显式的实现接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace classTest
{
    internal class Speaker : IAmericanGreeting, IChineseGreeting
    {
        // 显式的实现接口
        void IChineseGreeting.sayHello()
        {
            Console.WriteLine("你好");
        }

        void IAmericanGreeting.sayHello()
        {
            Console.WriteLine("Hello");
        }
    }
}

显式实现接口的注意点

  • 若显式实现接口,方法不能使用任何的访问修饰符,显式实现的成员都默认为私有
  • 显式实现的成员默认都是私有的,这些成员都不能通过类的对象进行访问


5.显式/隐式实现接口的场景


  1. 采用隐式接口实现时,类和接口都可以访问接口中的方法,而采用显式实现接口,接口的方法只能通过接口来访问,因为此时接口的方法默认为私有
  2. 当类实现单个接口时,通常使用隐式接口实现
  3. 当类实现多个接口时,并且接口的方法名称、参数和返回类型都相同的时候,则应该使用显式接口实现


6.接口与抽象类

接口与抽象类的区别主要有以下几点

  1. 抽象类使用 abstract 关键字定义,而接口使用 interface 进行定义;它们都不能进行实例化
  2. 抽象类中可以包含虚方法、非抽象方法、和静态成员,接口中不能包含虚方法和任何的静态成员,并且接口中只能定义方法,不能有具体实现,方法具体由实现类来完成
  3. 抽象类不能实现多继承,接口支持多实现
  4. 抽象类是对一类对象的抽象,继承与抽象类与抽象类为属于的关系;而类实现接口,只是代表实现类具有接口声明的方法,是一种Can-do的关系,所以接口后一般带有able的字段,表示能做

标签:04,读书笔记,C#,System,接口,实现,显式,using,抽象类
From: https://www.cnblogs.com/trueasureyuki/p/17563967.html

相关文章

  • [Typescript] 150 Hard - OptionalUndefined
    Implementtheutiltype OptionalUndefined<T,Props> thatturnsallthepropertiesof T thatcanbe undefined,intooptionalproperties.Inaddition,asecond-optional-generic Props canbepassedtorestrictthepropertiesthatcanbealtered.Opti......
  • Learning hard C#学习笔记——读书笔记 05
    1.什么是IL语言我们开篇介绍C#的时候,就介绍了C#的编译过程,C#会通过编译器先编译成IL语言(IntermediateLanguage),IL代码会存放在一个程序集中IL(IntermediateLanguage),它称为CIL或者MSIL,IL是由ECMA组织(也就是定义JS标准的那个组织),提供完整的定义和规范。使用VisualStudio......
  • 搭建本地ChatGPT
    -1下载并安装Docker【官网下载】2使用开源项目:潘多拉(Pandora)【github】3一键安装命令:dockerpullpengzhile/pandora启动端口:8899dockerrun-ePANDORA_CLOUD=cloud-ePANDORA_SERVER=0.0.0.0:8899-p8899:8899-dpengzhile/pandora4获取自己的......
  • [CTSC2015] 日程管理
    [CTSC2015]日程管理题意幽香是幻想乡中一个非常有地位的人。她日理万机,事务繁多,反倒自己已经快管理不过来了。于是他决定开发一个日程管理软件来帮助自己管理任务。对于每个任务\(i\)有一个对应的截止日期\(t_i\)以及收益\(p_i\),表示若幽香能在不晚于第\(t_i\)天完成这个任务,......
  • docker使用
    启动第一个docker容器:1.获取镜像:从配置好的docker镜像站中拉取nginx镜像。2.运行镜像,生成容器常用命令:dockerrim+镜像iddockerimagels---查看下载的镜像dockerrun参数镜像名字/id---运行镜像  dockerrun-d-p80:80nginx(-d:后台运行不占用内存;)dockerps---......
  • [Typescript] 149 Medium - Triangular number
    GivenanumberN,findtheNthtriangularnumber,i.e. 1+2+3+...+N/*_____________YourCodeHere_____________*/exporttypeNumberToArray<Textendsnumber,Rextends1[]=[]>=R["length"]extendsT?R:NumberToArray&......
  • CSS中关于Calc 函数的使用规则
    calc()函数用于动态计算长度值。需要注意的是,运算符前后都需要保留一个空格,例如:width:calc(100%-10px);任何长度值都可以使用calc()函数进行计算;calc()函数支持"+","-","*","/"运算;calc()函数使用标准的数学运算优先级规则;......
  • RocketMQ安装部署
    1.下载安装包解压2.环境配置系统变量3.修改配置conf/broker.confenablePropertyFilter=true#指定nameser的地址,把borker与nameser关联起来namesrvAddr=127.0.0.1:98764.启动先启动mqnamesrv.cmd,再启动mqbroker.cmd5.自动创建topicstartmqbroker.cmd-n1......
  • csv 压测读取常用策略
    如果想csv里的数据只使用一次     ================================== 遇到空行不结束 循环往复执行 -------------------------------------------------------------currentthread慎用,因为是随机的[bot]非常抱歉,我之前的回答中的"RandomOrder"......
  • AtCoder Beginner Contest 310
    A-OrderSomethingElse#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,p,q;cin>>n>>p>>q;......