搜索
首页后端开发C#.Net教程C#中的抽象类与接口的详解

C#中的抽象类与接口的详解

Sep 25, 2017 am 11:15 AM
.net详解

问题出现:

我们在使用C#的抽象类和接口的时候,往往会遇到以下类似的问题,大致归纳如下:

(1)抽象类和接口有什么本质的区别和联系?

(2)什么时候选择使用抽象类,然啥时候使用接口最恰当呢?

(3)在项目中怎样使用才能使得项目更具有可维护性、扩展性?怎样将它和Struct,类紧密的结合,达到最终的双刃剑作用?

解决方案:

这也是我在学习抽象类和接口的时候遇到的问题,从我归纳的这三个问题,不难看出这也许是我们大多数程序员遇到问题的三个阶段,

第一阶段(基础概念):就象问题1一样,这部分人首先需要扫清基础概念的障碍,首先得懂得什么叫抽象类,什么叫接口?

然后了解抽象类和接口之间的区别和联系是什么?当然这可能需要一段时间去理解和实践,毕竟这些概念比较抽象,属于那种摸不着看不到的东西,当然最主要还是多练习,没事的时候做个Demo实例,把它们都使用一遍,在使用的过程中多想想为什么要这样用?这用有什么好处?能不能使用接口呢,如果不能,使用抽象类好处又在哪?这样可以加深对它们的理解,这也是我的一点点经验吧,呵呵!说了这么多,我还是把问题1总结一下,一是方便自己记,二是加深理解吧。

抽象类和接口的概念:其实这些概念在教科书和博客里基本上一大堆,前辈们总结的也很好了,但是可能在通俗、易懂方面有点晦涩难懂,我就翻译一下,加点陕西版的白话文,嘿嘿。

(1)抽象类:提供了一组派生类访问共享基类的公共方法;

抽象类的特性是:(1)抽象类既包括抽象方法,也可以包括方法的实现;(2)抽象类不能被实例化,也不能被密封;(3)抽象类中的抽象方法要么在派生类中实现,要么用派生抽象类继承(抽象派生类可以继承基类抽象方法的),如果要在派生类中实现 基类的抽象方法,必须使用override 修饰符;(4)抽象类属于单继承(这点属于所有类的同性,在这提一下)(5)抽象类是一族群的抽象,类似于 IS-A;

以上我如果说的还不是很清楚,给你个官网的关于抽象类的地址:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract

(2)接口:包含了一组虚方法的抽象类型;

接口的特性是:(1)接口中只包括虚方法的定义,只有声明定义,没有函数实现;(2)接口类中可以包括属性、事件、索引器等,但不能包括字段;(3)接口类属于多继承;(4)继承了接口的类必须全部实现接口的方法;

抽象类和接口的区别和联系:

相同点:(1)都是不能直接实例化,只能通过继承方式去实现;

(2)都是对事物行为和对象的抽象,形成一定的设计模式;

不同点:

(1)接口支持多继承;抽象类不能实现多继承;

(2)接口包括方法、属性、事件、索引器,不能包括字段;抽象类可以包括字段,也可以包括方法的实现;

(3)接口可以支持回调,抽象类不支持回调

(4)接口可以作为值类型和引用类型基类,而抽象类只能作为引用类型的基类;

第二阶段(使用阶段):就象问题2一样,这部分人对基础有了一定的了解,但就是缺乏一定的实践,或许就是做个简单的Demo了事,那么什么时候用抽象类,啥时用接口呢?

分析第二个问题,我提出3点建议:

第一个建议,对基础概念不只是概念的记忆,要多练、多思,然后再多练、再多思,循环几次,直到熟烂于心;

第二个建议,尽量在自己的项目中使用这方面的知识,去使用它,你才能发现问题,解决问题,才会思考;

第三个建议,对自己使用过的抽象类和接口的项目的知识点进行总结和归纳;
      就什么时候使用抽象类和接口,我总结前辈的经验,给出以下几点,仅供参考:

(1)当设计的组件将来有多个版本的时候一般使用抽象类,例如用C#设计数据库DB,刚开始你可能使用的是sql server ,mysql,以后大型的项目可能要使用oracle,DB这种大型的数据库系统,那么我们在设计类的时候就设计一个抽象的基类DB,让它具有                       数据的一些通用的属性和方法,属性:数据库的连接名,版本,数据库类型,数据库的通用方法:Open(),Close()方法等;

(2)当设计的组件同时支持通用的行为动作,可以考虑接口;例如鸟类,人类,车类都可以有声音,这时候可以设计接口,包含叫的函数行为,然后在各个具体的类中实现;

(3)在继承了接口的派生类或接口中,一旦该接口需要增加行为方法是个比较头疼的事情,必须所有的继承都必须实现它的方法,这个时候可以在派生类去实现一个新增的接口,来实现派生类的独特动作,举例说明:

/// <summary>
/// 实现一个爬行动物的动作接口
/// </summary>
interface IAnimalClimb
{
void Climb();
}
/// <summary>
/// 实现一个会叫的动物的动作接口
/// </summary>
interface ICry
{
void Cry();
}
/// <summary>
/// 实现一个动物抽象类
/// </summary>
public abstract class Animal
{
//动物的名字
public string Name { get; set; }
//动物的颜色
public string Color { get; set; }
//动物抽象类的共有方法
public abstract void Sleep();
public abstract void Breathe();
}
/// <summary>
/// 定义鸟类,通用方法是会飞
/// </summary>
public class Bird : Animal,ICry
{
public override void Sleep()
{
Console.WriteLine("Bird派生类继承了基类的Sleep()方法");
}
public override void Breathe()
{
Console.WriteLine("Bird派生类继承了基类的Breathe()方法");
}
//鸟类可以继承统一的接口动作,例如:叫
public void Cry()
{
Console.WriteLine("Bird派生类继承了接口ICry的叫的方法");
}
}
/// <summary>
/// 定义爬行动物类
/// </summary>
public class Snake : Animal, IAnimalClimb
{
public override void Breathe()
{
Console.WriteLine("Snake派生类继承了基类的Sleep()方法");
}
public override void Sleep()
{
Console.WriteLine("Snake派生类继承了基类的Sleep()方法");
}
//爬行动物可以继承统一的接口动物,例如:爬
public void Climb()
{
Console.WriteLine("Snake派生类继承了接口IAnimalClimb的爬的方法");
}
}

以上代码,只是说明问题,比较简单;
第三阶段(优化阶段):就象问题3一样,我们在做一个抽象类或者接口的时候首先考虑的是能用就行,结果就是定义的类或接口比较多,难以维护和扩展,或者就是类之间有交集,那怎么优化继承关系?怎样才能使得程序具有可维护性和扩展性呢?
我个人建议具备以下几个方面方可:
(1)要有扎实的基础知识和深厚的基础功底;
(2)要有一个多问、多思的心;对于抽象类和接口多问问,为什么不使用抽象类而要使用接口?为什么在这个地方使用接口合适?
(3)多看看前辈们是怎么设计接口和类的,这方面的资料网上搜搜不少;
(4)个人建议多看看设计模式这方面的知识,因为他们是前辈在设计时的经验和思想; 

以上是C#中的抽象类与接口的详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
c#和.net:了解两者之间的关系c#和.net:了解两者之间的关系Apr 17, 2025 am 12:07 AM

C#和.NET的关系是密不可分的,但它们不是一回事。C#是一门编程语言,而.NET是一个开发平台。C#用于编写代码,编译成.NET的中间语言(IL),由.NET运行时(CLR)执行。

c#.net的持续相关性:查看当前用法c#.net的持续相关性:查看当前用法Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。

从网络到桌面:C#.NET的多功能性从网络到桌面:C#.NET的多功能性Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#.NET与未来:适应新技术C#.NET与未来:适应新技术Apr 14, 2025 am 12:06 AM

C#和.NET通过不断的更新和优化,适应了新兴技术的需求。1)C#9.0和.NET5引入了记录类型和性能优化。2).NETCore增强了云原生和容器化支持。3)ASP.NETCore与现代Web技术集成。4)ML.NET支持机器学习和人工智能。5)异步编程和最佳实践提升了性能。

c#.net适合您吗?评估其适用性c#.net适合您吗?评估其适用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代码:探索编程过程.NET中的C#代码:探索编程过程Apr 12, 2025 am 12:02 AM

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

C#.NET:探索核心概念和编程基础知识C#.NET:探索核心概念和编程基础知识Apr 10, 2025 am 09:32 AM

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

测试C#.NET应用程序:单元,集成和端到端测试测试C#.NET应用程序:单元,集成和端到端测试Apr 09, 2025 am 12:04 AM

C#.NET应用的测试策略包括单元测试、集成测试和端到端测试。1.单元测试确保代码的最小单元独立工作,使用MSTest、NUnit或xUnit框架。2.集成测试验证多个单元组合的功能,常用模拟数据和外部服务。3.端到端测试模拟用户完整操作流程,通常使用Selenium进行自动化测试。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器