热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#多态方面新的感悟

一、摘要:  这几个月使用Lua进行开发,对C#方面的内容久放后,实在是疏离了不少,这两天终于闲下来,打算重拾C#,不过在使用了Lua这种轻量级的脚本语言一段时间后,通过其模仿高级

一、摘要:

  这几个月使用Lua进行开发,对C#方面的内容久放后,实在是疏离了不少,这两天终于闲下来,打算重拾C#,不过在使用了Lua这种轻量级的脚本语言一段时间后,通过其模仿高级语言的生态,让我对C#的高级语言特性也明白了不少,特此做一个小小的总结。


二、继承方面:

  什么是继承?在Lua中是通过元表这个非常强大的语言特性进行模拟继承特性的,简述其原理就是:将特定的“子表”的元表设置为其“父表”,这样的话,通过元表的特性,当调用某方法或属性时,在“子表”中无法找到该属性变量时,就会通过元表索引到其“父表”中查找。所以其表现的实质就是:子表复制了一份父表的属性和方法。

  好了,通过这种方式就可以解释什么是继承了:Is-A ,某个类为什么要派生自其父类?因为它需要其父类的属性或方法,这个父类应该是高度概括了某种事物应该具备的共性,就像说什么是人类?能使用工具、有头有手有脚......一大堆特性聚合体的生物,然后其派生类男性人类、女性人类都应该具备这些基本的特性。

  继承不可乱用的原因在哪?

  那就是因为派生类在其派生的时候(实例化出派生类的对象),会完整的复制一份父类的所有属性与方法(这就是Lua通过元表能模拟出的强大特性)。就像人类从胚胎发育成幼儿,其需要复制一份通用的数据:头啊、四肢、躯干等等,直到其需要派生的部分出现,然后实例化其派生类所拥有的特性:男性丁丁啊之类的。这就是一个继承过程。(在此对计算机大佬们拜服。)

  这时候就想想,如果这份人类数据并不是高度精炼,高度通用的话,会出现什么事呢?我们不妨假设这份人类数据里,共性中包含丁丁(并不是我粗俗...实在是不知道其他有啥特别明显的特征。),那么这就十分恐怖了,人类说玩完儿了也不过分。而在代码世界中,这种情况可能不会导致严重的后果,但是也是一件十分糟糕的事情,或许我们平时个人开发,或者项目规模比较小的时候不觉得,如果某个冗余的基类派生了成千上万个类,而起派生类又实例化了成千上万个对象。那么那些冗余的数据可能就会有上百万份同时存在的可能,光是想想就为运行设备捏了把冷汗。

  所以继承必须慎之又慎,我们可能做不到大佬那样在动手写之前就考虑的周道万分,但是在开发过程中,要不断的重构代码精简设计,很多优秀的设计其实都是重构才产生出来的,并不是一定框架用终身,而是不断调整框架适用实际需求的。


三、继承多态性的体现:

  多态性的核心体现其实就是通过声明其父类,然后通过父类的通用特性来在运行过程中再决定其具体实现该特性的对象。比如说,某超市为了推销他们的产品,现在要招100个人来试吃某产品。(人就是父类,超市需要的是人这个群体来试吃,他们并不会管这个人是男人(派生类)、女人(派生类)、小男孩(男人的派生类)等等具体的属性,重要的是这些派生类都拥有父类人的共性(吃)这个能力就行了。)

  然后在试吃现场,超市就调用了这个类(人)的实例化方法(现场招募),然后让这些对象(试吃群众)调用他们自身的共性方法(吃),表现出多态性(吃的方式不同,吃的数量也不同.....)


四、接口方面:

  接口,在我的理解中,他就像是一份协议、或者说职业声明一样(0.0形象化比较好理解),他规定了一个职业应该具备哪些条件(属性),哪些技能(方法)。比如说假定成为护士的协议(接口)为:20岁以上、50岁以下、性别为女、且掌握护理学、临床医学等等诸多技能。那么这就规定好了一个护士的标准,进行了标准化和规范化。这样在某个医院需要在派遣某些护士去处理事情的时候,就不用特别考虑这个护士是不是掌握了护理学,或者她是不是女性人类。因为这些都是事先规定好的,且必须实现的。(接口中并没有具体实现,而继承它的子类,必须对那些接口规定的属性和方法有具体的实现

  在C#中,因为类的继承具备单根性,也就是说每个类只能继承自一个父类,而不是像C++一样可以多重继承。接口就是对这种强大的功能特性进行的一种补充模仿,类可以继承多个接口,通过接口实现了多重继承,我们就能同样便捷的使用其多态性,来精简我们的代码,优雅的实现一些功能。

  其多态性的体现与继承一致,或者说它就是精简的、不复制属性和方法的继承。因此不再赘述。


五、对多态性的总结:(多态性分为两类)

1.静态多态性:(声明时决定)

  C#中是通过了两种方法来实现:1、函数重载。2、运算符重载。(因为比较简单,不赘述)


2.动态多态性:(运行时决定)

  C#中是通过了两种方式来实现:1、抽象类。 2、虚方法(这一点就是通过virtual关键字,部分定义必须在派生类中具体实现的方法(必要条件)。可以理解为,作为一个人他的必要条件是呼吸,那么派生类男人女人们必须拥有自己的呼吸方式,而不能不呼吸(实现))


有感而发,有些概念还仍待精炼或者存在错误,希望有看到的大佬进行斧正。



推荐阅读
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • SWIG 3.0.12 Windows官方版下载:实现C语言与PHP、Java、Python等多语言代码互调接口
    SWIG 3.0.12 Windows官方版是一款强大的接口生成工具,能够实现C语言与多种高级编程语言(如Java、C#)及脚本语言(如PHP、JavaScript、Python)之间的互操作性。它不仅支持跨语言调用,还提供了丰富的封装选项,确保了代码的高效性和可维护性。 ... [详细]
  • 本教程介绍如何在C#中通过递归方法将具有父子关系的列表转换为树形结构。我们将详细探讨如何处理字符串类型的键值,并提供一个实用的示例。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 利用Python与Android进行高效移动应用开发
    通过结合Python和Android,可以实现高效的移动应用开发。首先,需要安装Scripting Layer for Android (SL4A),这是一个开源项目,旨在为Android系统提供脚本语言支持。SL4A不仅简化了开发流程,还允许开发者使用Python等高级语言编写脚本,从而提高开发效率和代码可维护性。此外,SL4A还支持多种其他脚本语言,进一步扩展了其应用范围。通过这种方式,开发者可以快速构建功能丰富的移动应用,同时保持较高的灵活性和可扩展性。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • 本文详细介绍了在 Sublime Text 中配置 Lua 编译环境的方法与实际操作步骤。首先,用户需获取 `lua.exe` 和 `luac.exe`,可通过安装 Lua for Windows 或 SciTE 实现,也可自行编译源代码。接着,将 `lua.exe` 的路径(如 C:\Program Files\Lua\)添加至系统环境变量中,确保命令行可全局调用。此外,文中还提供了配置 Sublime Text 构建系统的具体设置,帮助开发者高效调试 Lua 脚本。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 解决Win10系统中CAD软件无法通过拖拽方式直接打开文件的问题方法 ... [详细]
  • 在iOS平台上,应用的流畅操作体验一直备受赞誉。然而,过去开发者往往将更多精力集中在功能实现上,而对性能优化的关注相对较少。本文深入探讨了iOS应用性能优化的关键要点与实践方法,旨在帮助开发者提升应用的响应速度、降低功耗,并改善整体用户体验。通过具体案例分析和技术解析,文章提供了实用的优化策略,包括代码层面的改进、资源管理优化以及界面渲染效率的提升等。 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • Redis客户端使用指南与学习笔记
    本书基于Redis 3.0版本编写,虽然与后续版本存在一些差异,但仍详细介绍了Redis服务器的一对多客户端连接机制。书中不仅涵盖了基本的安装配置和命令操作,还深入探讨了数据结构、持久化策略及性能优化等高级主题,适合初学者和进阶用户参考学习。 ... [详细]
author-avatar
Edison小磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有