博客
关于我
了解继承和多态
阅读量:758 次
发布时间:2019-03-23

本文共 1871 字,大约阅读时间需要 6 分钟。

好的,我来仔细分析一下如何优化这段内容。以下是优化后的版本:


1、继承的概念

继承是一种强大的功能可以帮助我们模拟现实世界中的.is a关系。比如,汽车是一种有四轮、发动机的物体,但车也是一个物体。在代码中,继承可以通过创建一个新类并继承已有类来实现。这样做的好处包括减少代码冗余,提高代码复用性以及使程序结构更加清晰。

创建一个新类时,我们需要提取父类和子类共有的属性放到公类中。然后删除不必要的代码,保留子类独有的特性。继承还意味着子类可以选择性地扩展或修改父类的功能,而不会意外破坏父类本身的功能。通过使用base关键字,我们可以调用父类的构造函数或成员。


2、base关键字的作用

在C#中,`base`是一个非常重要的关键字。当子类的构造函数或方法需要调用父类的对应成员时,就可以使用`base`关键字。例如,在子类的构造函数中添加`: base(参数)`,可以让子类的初始化过程调用父类的构造函数。

使用base关键字可以让我们指定调用父类的哪一个构造函数。例如,如果父类有多个构造函数,子类的构造函数可以选择性地调用其中一个。如果没有明确指定base,则默认会调用父类的无参构造函数。这使得继承关系更加灵活。


3、protected修饰符的作用

`protected`修饰符的作用是限制成员的访问权限。被`protected`修饰的成员可以在同一项目内的其他子类中访问,而不会被外部类或其他项目访问。这种访问控制可以有效避免代码的泄露,同时保持代码的开放性和可扩展性。合理使用`protected`修饰符,可以帮助构建更安全的类库。

4、子类的构造函数行为

在C#中,子类的构造函数行为与 Java 类似。创建子类对象时,会自动调用父类的构造函数。为了更好地初始化父类的属性,子类的构造函数可以选择性地显式调用父类的构造函数。使用`base`关键字可以实现这一点,但需要注意参数的传递必须与父类构造函数的定义一致。

如果子类的构造函数中没有调用父类的构造函数,系统会默认调用父类的无参构造函数。这种默认值通常是可以接受的,但在某些情况下,显式调用父类构造函数可能会更便于初始化。


5、多态的引入

多态(Polymorphism)是面向对象编程中的一种重要概念。它解决了继承带来的一个问题:当同一个操作作用于不同对象时,可能需要不同的处理方式。例如,一个方法可能在处理不同类型的对象时,产生不同的结果。

通过使用virtual关键字,我们可以在方法的定义阶段指定该方法可能需要重写。在子类中,可以使用override关键字来标记重写后的方法。在运行时,方法调用的目标方法是根据调用对象的实际类型来决定的,从而实现了运行时的多态。


6、seale密封类

`sealed`关键字可以将一个类标记为密封类。这意味着这个类不能被其他类继承。如果不小心创建一个不可延伸的继承结构,使用`sealed`可以避免潜在的问题,特别是对于像 `string` 这样的框架类,它们通常被设计为不可变的。

sealed标记的类不能继承,因此它们在某些情况下可以提高性能和安全性。然而,合理使用sealed关键字也需要根据实际需求来决定。


7、继承的价值

继承是一种强大的工具,它不仅帮助我们减少代码冗余,还让程序结构更加清晰。通过继承,我们可以在现有代码的基础上扩展功能,而不必重写整个系统。

现实世界中,继承关系类似于错乱的母-daughter关系。而在代码中,继承关系遵循 is a 这种单向关系,也就是一个子类只能有一个父类。这是多继承所不允许的,但它也确保了继承结构的向上相容性。多态可以通过不同的方法实现不同的行为,使继承关系更加灵活。


8、多态与继承的关系

多态至关重要,因为它解决了继承带来的类型依赖性问题。通过多态,我们可以在运行时根据对象的实际类型来决定方法的执行方式。例如,在java中,`Object.toString()` 和 `String.toString()` 产生了不同的结果。

多态并不改变继承的单根性质(每个子类只能继承一个父类),但它扩展了继承的功能,使其更加灵活。通过合理使用virtualoverride关键字,可以在继承关系中实现调用正确的方法。


总结

通过以上内容,我们可以看到继承和多态是面向对象编程中的两大核心概念。继承帮助我们复用代码,而多态帮助我们灵活处理不同类型对象的行为。理解这些关键概念,对于任何一道面试题、项目开发或系统设计都是至关重要的。今天的分享就到这里,欢迎大家在评论区留言交流~

转载地址:http://inpzk.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>