浅谈C#中的抽象类(abstract)和接口(interface)

C#抽象类(abstract class)与接口(interface)深度解析 本文详细探讨了C#中抽象类与接口的核心概念、主要区别、设计理念、应用场景以及高级特性。抽象类用于定义“是什么”关系,支持共享代码、状态维护和访问控制,适合作为基类使用。接口则定义“能做什么”关系,支持多重继承和松耦合设计,适合定义组件间契约。文章还对比了两者在结构、功能、版本演进等方面的差异,并提供了具体的使用场景和代码示例。此外,介绍了显式接口实现、默认接口实现等高级特性,以及抽象类与接口的组合使用方式。最后,简要分析了抽象类与接口在运行时性能上的差异。 阅读详情

        很多C#的初学者在编程时都容易把抽象类和接口搞混,甚至很多编程老鸟也没有弄明白为什么有了抽象类又搞个接口(这里也包括了本老鸟)。所以这里整理了C#抽象类和接口的区别,详细的分析了抽象类与接口的概念与特性,并对二者作出比对说明。

一、基本概念

1、接口

        接口是指对协定进行定义的引用类型,其他类型实现接口,以保证它们支持某些操作。接口指定必须由类提供的成员或实现它的其他接口。与类相似,接口可以包含方法、属性、索引器和事件作为成员。

1、接口存在的意义是为了实现多态;
2、接口中只能包含方法(属性、事件、索引);
3、接口的成员不能有任何实现;
4、接口不能被实例化;静态类、抽象类也不可以被实例化
5、接口的成员不能有访问修饰符(默认为public);
6、实现接口的子类必须将接口的所有成员函数实现;
7、子类实现接口的方法时,不需要任何关键字,直接实现即可。(抽象类、虚方法需要加override)

2、抽象类

        抽象类,在面向对象过程中,所有的对象都是类描绘的,反过来,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类

1、抽象方法只能出现在抽象类中,但是抽象类中可以包含普通方法。
2、在父类中定义的抽象方法不能实现。
3、抽象类不能实例化(也就是不能new出来)。
4、抽象类与抽象方法需要添加abstract关键字。
5、子类实现父类的抽象方法时,需要添加override关键字。
6、如果抽象类的子类不是抽象类,那么子类中必须重写父类抽象类的所有抽象方法。

二、抽象类和接口的相同点和区别

1、相同点

1、不能实例化;

2、包含未实现的方法声明

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)

2、不同点

1、接口可以多继承,抽象类不能实现多继承。
2、接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员。
3、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念。
4、接口支持回调,抽象类不能实现回调,因为继承不支持。
5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。
6、接口可以作用于值类型和引用类型,抽象类只能作用于引用类型(例如:Struct只能继承接口)。
7、抽象类应主要用于关系密切的对象,而接口则是适合为不相关的类提供通用功能。
8、接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。
9、接口多定义对象的行为,抽象类多定义对象的属性。
10、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类。
11、接口对应是面向对象编程思想的重要原则:面向接口编程。

三、实例分析

1、接口实例

using System;
//接口的定义
interface ICreature
{
    void Eat();
    void Walk(int distance);
    string Vocalize();
}

public class Author : ICreature
{
    private string name;
    public Author(string name)
    {
        this.name = name;
    }
    public void Eat() { }
    public void Walk(int distanc) { }
    public string Vocalize()
    {
        return "";
    }
}

class Program
{
    static void Main(string[] args)
    {
        ICreature man = new Author("marcopro");
        man.Eat();
        man.Walk(10);
        man.Vocalize();
    }
}

2、抽象类实例

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Author ar = new Author("Tom");
            Reader rdr = new Reader("Jack");
            Console.WriteLine(ar.name);
            Console.WriteLine(rdr.name);
            ar.doSomething();
            rdr.doSomething();
        }
    }

    public abstract class Human
    {
        public string name;
        public int age;

        public Human(string name)
        {
            this.name = name;
            this.age = 0;
        }
        public void  showBaseInfo(){ } 

        public void showFullInfo(){ }
       
        public void doSomething() {

            Console.WriteLine(this.name+": let me do something!");
        }
    }

    public class Author:Human
    {
        public Author(string name) : base(name) { }

    }

    public class Reader : Human
    {
        public Reader(string name) : base(name) { }
    }
}

小结:

上面整理了那么多关于接口和抽象类的知识点,那么回到起点到底接口和抽象类分别是用来做什么的呢?

个人总结如下:

接口,更多的是一种规范,为了方便不同各业务场景之间的正常对接,不存在实际方法的实现。

抽象类,更多的是为了多态,为了面向对象而生,充当类的继承的第一代。

C# virtual 和 abstract 详解 在C#中,virtual和abstract关键字都用于面向对象编程中的继承和多态,它们主要用于方法、属性和事件的定义,但在用法上存在一些重要的区别。abstract表示抽象成员,没有实现,必须在派生类中重写。它只能出现在abstract类中。使用规则只能在abstract类中使用,不能用于sealed类(密封类)。没有方法体,子类必须override提供具体实现。抽象方法不能有private修饰符,但可以是protected或public。抽象方法在基类中不能有默认实现,必须在子类实现。 阅读详情

相关推荐

C# 中抽象类与接口的异同

抽象类和接口在 C# 编程中各有其独特的价值。开发者应根据具体的需求来选择使用抽象类还是接口,或者结合两者使用,以构建出更加灵活、可维护的软件系统。如果需要定义一组具有部分实现的通用行为且强调代码复用和层次结构,可选择抽象类;如果需要定义一组行为规范且强调行为的一致性和多态性,接口则是更好的选择。在 C# 编程中,抽象类和接口都是实现代码复用和多态性的重要工具,但它们在很多方面存在差异。理解这些异同,有助于开发者在实际项目中做出恰当的选择,以构建高效且可维护的软件系统。

candy的博客 1533

C# abstract详解

abstract修饰符用于简单的概括一个不完整的内容(摘要)。常用于基类,由派生类来继承实现基类的抽象属性和方法abstract 修饰符可用于类、方法、属性、索引和事件。

qq_35652006的博客 9964

vscode远程开发-调试模式下attach远程进程提示管理员权限失败的问题

vscode 远程开发 附加进程

comhaqs的专栏 2878

c#接口和抽象类的区别

c#接口和抽象类的区别 大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二...

huang714的专栏 4471

用STM32定时器PWM高级功能驱动步进电机:F103C8T6+TB6600实战教程

本文详细介绍了如何利用STM32F103C8T6微控制器的定时器PWM高级功能驱动TB6600步进电机驱动器,实现高效、灵活的运动控制方案。通过硬件配置、PWM参数计算、运动控制算法及TB6600高级功能应用的全面解析,为工业自动化和精密控制领域提供了实用的技术参考。

game4的博客 186

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程

本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。

weixin_29313547的博客 673

博客摘录「 浅谈C#中的抽象类(abstract)和接口(interface)」2023年8月6日

5、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法,抽象类可以定义属性、字段、包含有实现的方法。抽象类,在面向对象过程中,所有的对象都是类描绘的,反过来,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类。3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)10、如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类。3、接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念。4、接口不能被实例化;

weixin_65414269的博客 131

Linux基础——“C语言高级编程” C语言中的细节你真的知道吗?

文章目录GCC简介 GCC简介 gcc 所支持后缀名解释 .c c原始程序 .C / .cc /.cxx C++原始程

weixin_44278698的博客 2511

c#:浅析接口(interface)与抽象类(abstract)的区别

在学习c#接口(interface)和抽象类(abstract)的时候 发现接口和抽象类极为相似,比如说:继承后都需要重写,或者都不能通过new关键字来实例化… ,那么他们之间到底有什么区别与联系 ? 一、接口的特征 ​ 1、接口使用interface关键字声明 ​ 2、接口中的成员有属性、方法、事件,索引器并且都没有实现部分,可以说是没有方法体 ​ 3、接口中不能声明字段,接口中的成员不能使用任何修饰符 ​ 4、继承接口的类或结构必须隐式或显式实现接口中的所有成员 ​ 5、一个接口允许...

Peter的博客 1万+

STM32F103ZET6【标准库函数开发】------04五个串口配置实战:从零到一构建多串口通信系统

本文详细介绍了STM32F103ZET6标准库函数开发中五个串口(USART/UART)的配置实战,从硬件引脚识别、时钟树配置到多串口系统整合技巧。通过具体代码示例和调试经验,帮助开发者快速构建稳定的多串口通信系统,适用于工业控制、物联网网关等应用场景。

weixin_29188997的博客 344

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 763

C#中接口(Interface)与抽象类(abstract)的区别

接口和抽象类有哪些异同点呢?

凭时间赢来的东西,时间肯定会为之作证 10万+

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2027

c#中抽象类(abstract)和接口(interface)的相同点与区别

相同点: 1、都可以被继承 2、都不能被实例化 3、都可以包含方法声明 4、派生类必须实现未实现的方法 区别: 1、抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 2、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。” 3、接口可以被多重实现,抽象类只能被单一继承 4、抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中 5、

qq_36700578的博客 2075

【WRFDA第三期】OBSPROC namelist 变量总结

OBSPROC namelist 变量总结

WW、forever的博客 1120

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入解析 C# 中 abstract class 与 interface 的核心差异

C#中抽象类与接口的核心差异:抽象类用于表达"是什么(is-a)"关系,适合描述高度相关对象的共性,可包含字段、构造函数和部分实现;接口用于描述"能做什么(can-do)"行为契约,强调跨对象能力组合,支持多继承。关键区别在于:抽象类支持状态共享和分阶段实现,适合领域模型;接口专注行为规范和解耦,适合扩展机制。工程实践中应优先考虑接口,必要时使用抽象类。

bugcome的博客 1366

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C#中的class和interface

C#中的class namespace Class和interface { class Program { static void Main(string[] args) { Person person = new Person(); Console.WriteLine(person.GetAge(1)); //调用时使用实例化的对象调用 Console.Writ

闰土月下追猹 1041

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# 抽象类(abstract)和接口(interface)

** 抽象类: ** 在c#中使用关键字abstract来定义的抽象类和抽象方法。 不能初始化的类被叫做抽象类,他们只提供部分实现,但是另一个类可以继承它并且能创建他们的实例。 使用abstract在一个声明中表示该类倾向要作为基类成员被标示成abstract,或被包含进一个抽象类,必须被其派生类实现。 抽象类的例子: 子类继承后:重载抽象方法(必须使用关键字override) 抽象类具有以下特征: 1、抽象类不能被实例化。 2、抽象类可以包含抽象方法和访问器 3、不能把抽象类用密封(seal

hehe_优快云ALS的博客 1377

c#中抽象类(abstract)和接口(interface)的异同

c#中抽象类(abstract)和接口(interface)的异同 抽象类: 1.抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 2.抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 3.具体派生类必须覆盖基类的抽象方法 4.抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。 5...

何明洋的编程技术博客 3657

C#基础 13 抽象abstract 与接口 interface

关键字: 使用abstract关键字可以创建不完整且必须在派生类中实现的类和类的成员。 抽象类 抽象类是特殊的类,只是不能被实例化;除此以外具有类的其他特性; 重要的是抽象类可以包括抽象方法,这是普通类所不能的; 抽象类中也可以编写非抽象方法; 抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。 抽象父类申请成对象,不能构造成父类使用,只能构造子类来使用。 抽象类中可...

张+的博客 383

C# interface和abstract class

Abstract Class 在C++中,有纯虚函数的类是抽象类,抽象类不能被实例化,只能作为基类使用,里面的纯虚函数就是其子类必须实现的接口,所以虚基类也叫做接口类。也就是说,抽象类只能通过接口和作为其它类的基类使用,写法如下所示: class ExampleCPlusPlus { public: virtual void fun1() = 0; //纯虚函数 vrtual void fu...

alexhu2010q的博客 425

abstract class和interface有什么区别?_走进C# abstract,了解抽象类与接口的异同

思维导航:前言abstract修饰符抽象类与接口的异同抽象类和接口的使用总结参考资料文章正文:?回到顶部前言:  最近在研究.NET Core的一些类库源码的时候发现在底层类库中使用了大量的抽象类,然而发现自己搬砖这么多年好像从来没有在项目中使用抽象类或者抽象方法去实现某个功能模块,并且对修饰符Abstract概念也只懂得一些皮毛(也就是面试的时候会问下其基本作用)。当然,咱们不懂就要去...

weixin_33438741的博客 356

C# -- Abstract、Virtual、interface

2)接口方法默认是公有方法,不能用public abstract等修饰,无字段变量,无构造函数。4)接口和抽象类最本质的区别:抽象类是一个不完全的类,是对对象的抽象,而接口是一种行为规范。2)基类中定义了virtual方法,派生类中使用override重写该方法。2)抽象方法的实现必须在派生类中使用override关键字来实现。1)abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。1)interface用来声明接口,只提供一些方法规约,不提供方法主体。3)接口方法可包含参数。

qq_41674581的博客 654

C#接口(interface)与抽象类(abstract)的区别

C#接口(interface)与抽象类(abstract)的区别

过客 882

C#中的Interface、Abstract和Virtual

C#中Interface、Abstract和Virtual的区别

m0_37980851的博客 646
上一篇: 浅谈面向过程和面向对象的区别
下一篇: C#的多线程、线程池和Task
MarcoPro
博客等级 码龄4年 415粉丝 144原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值