C#-抽象类与接口

文章目录

  • 一、抽象类和接口总结
    • 总结
    • 补充说明
    • 主要区别
  • 二、抽象类
    • 2.1 抽象类概述与声明
    • 2.2 抽象方法
    • 2.3 抽象类与抽象方法的使用
  • 三、接口
    • 3.1 接口概述
      • 概述
      • 特征
      • 声明
      • 示例
    • 3.2 接口的实现和继承
      • 说明
      • 示例
    • 3.3 显式接口成员实现
      • 说明
      • 注意
      • 示例

一、抽象类和接口总结

总结

抽象类和接口这两种类型用于完全不同的目的。抽象类主要用作对象的基类,贡献某些主要的特性,例如共同的目的和结构。
接口则主要是用于类,为这些类去添加不同的方法(行为)。

补充说明

抽象类和接口都包含可以由派生类继承的成员,他们都能直接实例化,但可以声明他们的变量;
这样做,可以使用多态性把继承这两种类型的对象指定给他们的变量;
接着通过这些变量来使用这些类型的成员,但不能直接访问派生类中的其他成员【如上述例子】

主要区别

1、他们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口;
2、抽象类中可以定义成员的实现,但接口中不可以;
3、抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以;
4、抽象类中的成员可以是私有的(只要他们不是抽象的)、受保护的、内部的或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),但接口中的成员必须是公共的。

二、抽象类

2.1 抽象类概述与声明

一般将父类定义为抽象类,需要使用这个父类进行多态与继承。
继承树中越是向上,类就越发抽象;例如:奔驰继承汽车类,汽车类继承交通工具类等。

声明:使用abstract关键字

访问修饰符  abstract class 类名:基类或接口
{
}

声明抽象类

public abstract class myClass
{public int i;public void func(){	}
}

声明抽象类时,abstract、class和类名外是必须的;其余可选

2.2 抽象方法

抽象方法没有方法体,这个方法本身没有任何意义,需要被继承的类进行重写。
如果一个类中有抽象方法,那么这个类就需要被标记为抽象类。

抽象方法必须声明在抽象类中。
声明抽象方法时,不能使用virtual、static、private修饰符。

抽象方法声明引入了一个新方法,不提供方法的实现,因此方法体只包含一个分号。
当从抽象类的派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体的实现,重写抽象方法时使用override关键字。

声明:使用使用abstract关键字

public abstract class myClass
{public int i;public void func(){	}//声明抽象方法public abstract void method();
}

2.3 抽象类与抽象方法的使用

//声明抽象类abstract class MyClass{private string name;private int age;public string Name{get { return name; }set { name = value; }}public int Age{get { return age; }set { age = value; }}//抽象方法public abstract void showInfo();}//继承抽象类class SonClass : MyClass{//重写抽象方法public override void showInfo(){Console.WriteLine($"My name is:{this.Name},I am {this.Age} years old.");}}internal class Program{static void Main(string[] args){SonClass sonClass = new SonClass();	//实例化派生类MyClass son = sonClass;	//使用派生类实例化抽象类son.Age = 10;son.Name = "Nick";son.showInfo();Console.ReadLine();}}

运行结果:
运行结果

三、接口

3.1 接口概述

概述

由于C#中是单继承,但客观世界中出现多重继承的情况比较多,因此通过接口实现多重继承的功能。
接口是抽象类的延申,可以视作纯粹的抽象类,其中的所有方法都没有方法体。
使用接口继承关系
接口用来定义程序的协议,描述可属于任何类或结构的一组相关行为。
接口可由 方法、属性、事件、索引器 4种成员类型的任何组合构成,但不能包含字段。
类和结构可以继承多个接口,接口也可以继承其他的接口。

特征

接口可以将方法、属性、索引器、事件作为成员,但不能给这些成员设置具体的值。
特征:
类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
不能直接实例化接口。
接口可以包含事件、索引器、方法和属性。
接口不包含方法的实现。
类和结构可从多个接口继承。
接口自身可从多个接口继承。

声明

使用interface关键字,语法格式如下:

修饰符		interface		接口名称:继承的接口列表
{接口内容;
}

声明接口时,除interface关键字和接口名称外,其他的都是可选项;
可使用new、public、protected、internal、private等修饰符声明接口,但接口成员必须是公开的。

示例

interface ImyInterface
{string ID		//编号(可读可写){get;set;}string Name		//姓名(可读可写){get;set;}void ShowInfo();		//显式定义的编号和姓名
}

3.2 接口的实现和继承

说明

实现接口成员,类中对应的成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。
类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器;例如,接口定义一个带有get的访问器属性,而实现该接口的类,可以声明同时带有get和set访问器的同意属性;但是,如果属性或索引器使用 显示 实现,则访问器必须匹配。

接口的实现通过类继承实现。声明实现接口的类时,需要在基类列表中包含所实现的接口的名称。

示例

    interface ITest1{void Test1();}interface ITest2:ITest1{void Test2();}class TestClass :  ITest2{public void Test1(){Console.WriteLine("ITest1接口的Test1()方法");}public void Test2(){Console.WriteLine("ITest2接口的Test2()方法");}}

3.3 显式接口成员实现

说明

如果类实现两个接口,并且两个接口包含具有相同签名的成员,那么在类中实现该成员将导致两个接口都使用该成员作为他们的实现。
这样可能会导致接口实现的不正确,因此需要显示实现接口成员,即创建一个仅通过该接口调用并且特定于该接口的类成员。
显示接口实现是通过 使用 接口名称和一个句点 命名该类成员来进行实现。

注意

显示接口成员实现中 不能包含 访问修饰符、abstract、virtual、override或static修饰符。
显示接口成员属于接口的成员,而不是类的成员你,因此,不能使用类对象直接访问,只能通过接口对象来访问。

示例

    interface ImyInterface1{int Add();}interface ImyInterface2{int Add();}class My_Class : ImyInterface1, ImyInterface2{int ImyInterface2.Add() { return 1; }int ImyInterface1.Add() { return 0; }}internal class Program{static void Main(string[] args){My_Class myClass = new My_Class();//myClass对象中不包含Add方法,只能通过实例化接口对象来调用Add方法ImyInterface1 imyInterface1 = myClass;Console.WriteLine($"调用接口ImyInterface1 中的Add方法结果为: {imyInterface1.Add()}");//将myClass作为ImyInterface2,来调用其中的Add()方法Console.WriteLine($"调用接口ImyInterface2 中的Add方法结果为: {(myClass as ImyInterface2).Add()}");Console.ReadLine();}}

运行结果:
运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96406.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue框架--理解MVVM

我们知道,MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。我们看看MVVM的模型架构,如下所示: 架构理解与实例

差分数组/前缀和

文章目录 1094. 拼车1109. 航班预定统计303. 区域和检索 - 数组不可变560. 和为K的子数组523. 连续的子数组的和 1094. 拼车 class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] diff new int[1001]; // 记录每个站点改变的人数,比如…

R语言和Python用泊松过程扩展:霍克斯过程Hawkes Processes分析比特币交易数据订单到达自激过程时间序列...

全文下载链接:http://tecdat.cn/?p25880 本文描述了一个模型,该模型解释了交易的聚集到达,并展示了如何将其应用于比特币交易数据。这是很有趣的,原因很多。例如,对于交易来说,能够预测在短期内是否有更多…

融合MMEdu和Transformers技术的视障出行智能辅助系统(上海浦育AI未来夏令营结题论文)

融合MMEdu和Transformers技术的视障出行智能辅助系统 摘要 面对社会生活中众多视障者对出行的需求,视障出行智能辅助系统融合MMEdu和Transformers技术为视障者提供实时路况分析。本系统利用图像分类、目标检测和深度估计等软件技术,对摄像头实时获取的每…

【C++】异常处理详解

本篇文章重点将会对C中的异常的相关处理操作进行详解。希望本篇文章的内容会对你有所帮助。 目录 一、C语言的异常处理 二、C异常 2、1 异常概念 2、2 异常的使用 2、3 异常类 2、4 异常的重新抛出 三、异常的安全与规范 3、1 异常的安全 3、2 异常的规范 四、异常的优缺点 &am…

数据通信——传输层TCP(可靠传输机制的滑动窗口)

引言 之前提到过拥塞问题,如果大量数据疯狂涌入,接收端无法及时处理就会导致数据丢包,从而使得通信受到干扰。之前的连续ARQ如果不加以节制,疯狂发送报文,接收端无法及时返回ACK就会导致网络瘫痪。 滑动窗口机制协议 这…

C++实现蜂群涌现效果(flocking)

Flocking算法0704_元宇宙中的程序员的博客-CSDN博客 每个个体的位置,通过计算与周围个体的速度、角度、位置,去更新位置。

WPF+Prism+WebApi 学习总结

一、基本概念 WPF:WPF(Windows Presentation Foundation)是(微软推出的)基于Windows的用户界面框架,提供了统一的编程模型,语言和框架,做到了分离界面设计人员与开发人员的工作;WPF…

音频——硬件拓扑

文章目录 硬件拓扑I2S 数据通路五线模式四线模式两线 TX两线 RX 典型应用硬件连接数据流 硬件拓扑 控制路径:UART/I2C/SPI数据路径:I2S 简略图如下 I2S 数据通路 五线模式 四线模式 两线 TX 两线 RX 典型应用 硬件连接 控制信号:SPI 用…

数据结构体--5.0图

目录 一、定义 二、图的顶点与边之间的关系 三、图的顶点与边之间的关系 四、连通图 五、连通图的生成树定义 一、定义 图(Graph)是由顶点的又穷非空集合合顶点之间边的集合组成,通常表示为:G(V,E&…

linux C编程 获取系统时间

1.clock_gettime #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); struct timespec {time_t tv_sec; /* 秒*/long tv_nsec; /* 纳秒*/ }clk_id : CLOCK_BOOTTIME&#xff0c;以系统启动时间为时间原点的时间体系&#xff0c;不受其它因素的…

Ei Scopus 双检索 |第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议(JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engin…