iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#面向对象编程中的里氏替换原则是什么
  • 264
分享到

C#面向对象编程中的里氏替换原则是什么

2023-07-02 17:07:35 264人浏览 泡泡鱼
摘要

这篇文章主要介绍“C#面向对象编程中的里氏替换原则是什么”,在日常操作中,相信很多人在C#面向对象编程中的里氏替换原则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#面向对象编程中的里氏替换原则是什么

这篇文章主要介绍“C#面向对象编程中的里氏替换原则是什么”,在日常操作中,相信很多人在C#面向对象编程中的里氏替换原则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#面向对象编程中的里氏替换原则是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出。

    SOLID 原则包含:

    • S:单一功能原则(single-responsibility principle)

    • O:开闭原则(open-closed principle)

    • L:里氏替换原则(Liskov substitution principle)

    • I:接口隔离原则(Interface segregation principle)

    • D:依赖反转原则(Dependency inversion principle)

    里氏替换原则

    在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。它由芭芭拉·利斯科夫(Barbara Liskov)在1987年的一次会议上,在名为“数据的抽象与层次”的演说中首次提出。

    里氏替换原则的内容可以描述为:派生类(子类)对象可以在程序中代替其基类(超类)对象。

    也就是说,程序中的对象不管出现在什么地方,都应该可以使用其派生类(子类)的对象进行替换,而不影响程序运行的正确性。

    C# 示例

    我们看这样一个示例,假设一个企业有三种员工,一种是拿铁饭碗的永久雇员,一种是合同工,一种是临时工。我们设计几个类来表示这三种员工。

    糟糕的示范

    先定义一个 Employee 基类。

    public abstract class Employee{    public string Name { get; set; }    /// <summary>    /// 计算奖金    /// </summary>    /// <returns></returns>    public abstract decimal CalculateBonus();}

    再定义该基类的三个子类:

    /// <summary>/// 永久雇员/// </summary>public class PermanentEmployee : Employee{    public override decimal CalculateBonus()    {        return 80000;    }}/// <summary>/// 合同工/// </summary>public class ContractEmployee : Employee{    public override decimal CalculateBonus()    {        return 2000;    }}/// <summary>/// 临时工(临时工没有奖金)/// </summary>public class TemporaryEmployee : Employee{    public override decimal CalculateBonus()    {        throw new NotImplementedException(); //违反里氏替换原则    }}

    接下来在 Main 方法中调用它们。

    先定义一个类型为基类 Employee 的变量 e,再分别使用其子类 PermanentEmployee、ContractEmployee 和 TemporaryEmployee 创建对象赋值给基类变量 e,然后调用 e 的 CalculateBonus() 方法。

    static void Main(string[] args){    Employee e;    e = new PermanentEmployee() { Name = "张三" };    Console.WriteLine($"{e.Name} 的年终奖是 {e.CalculateBonus()} 元");    e = new ContractEmployee() { Name = "李四" };    Console.WriteLine($"{e.Name} 的年终奖是 {e.CalculateBonus()} 元");    e = new TemporaryEmployee() { Name = "王五" };    Console.WriteLine($"{e.Name} 的年终奖是 {e.CalculateBonus()} 元");}

    运行一下可以观察到(显而易见的),当使用 PermanentEmployee 和 ContractEmployee 类创建的对象替换基类型 Employee 的变量 e 时,调用 CalculateBonus() 方法可以正常运行,但是使用 TemporaryEmployee 类创建的对象替换变量 e 时,调用 CalculateBonus() 方法抛出了异常,导致程序无法正常运行。这就明显违反了里氏替换原则。

    那么,应该如何改进一下呢?

    正确的示范

    我们看到,每种员工都有基本信息 Name 属性,但是由于临时工 TemporaryEmployee 没有奖金,所以不需要计算奖金。因此我们应该把计算奖金的方法 CalculateBonus 单独抽象出去,而不是让它们都继承于同一个基类,并将 TemporaryEmployee 子类中的 CalculateBonus 方法抛出一个异常。

    改进后的代码:

    interface IEmployee{    /// <summary>    /// 计算年终奖    /// </summary>    /// <returns></returns>    public decimal CalculateBonus();}public abstract class Employee{    public string Name { get; set; }}/// <summary>/// 永久雇员/// </summary>public class PermanentEmployee : Employee, IEmployee{    public decimal CalculateBonus()    {        return 80000;    }}/// <summary>/// 合同工/// </summary>public class ContractEmployee : Employee, IEmployee{    public decimal CalculateBonus()    {        return 2000;    }}/// <summary>/// 临时工/// </summary>public class TemporaryEmployee : Employee{}

    在 Main 方法中,将调用它们的测试代码改为:

    static void Main(string[] args){    Employee e;    IEmployee ie;    var p = new PermanentEmployee() { Name = "张三" };    e = p;    ie = p;    Console.WriteLine($"{e.Name} 的年终奖是 {ie.CalculateBonus()} 元");    var c = new ContractEmployee() { Name = "李四" };    e = c;    ie = c;    Console.WriteLine($"{e.Name} 的年终奖是 {ie.CalculateBonus()} 元");    e = new TemporaryEmployee() { Name = "王五" };    Console.WriteLine($"{e.Name} 是临时工,无年终奖。");}

    程序运行正常。

    这样,这些子类的设计便遵循了里氏替换原则。

    到此,关于“C#面向对象编程中的里氏替换原则是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: C#面向对象编程中的里氏替换原则是什么

    本文链接: https://www.lsjlt.com/news/343505.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C#面向对象编程中的里氏替换原则是什么
      这篇文章主要介绍“C#面向对象编程中的里氏替换原则是什么”,在日常操作中,相信很多人在C#面向对象编程中的里氏替换原则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#面向对象编程中的里氏替换原则是什么...
      99+
      2023-07-02
    • C#面向对象编程中里氏替换原则的示例详解
      目录里氏替换原则C# 示例糟糕的示范正确的示范总结在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程...
      99+
      2024-04-02
    • C#面向对象设计原则之里氏替换原则
      里氏替换原则(LSP) 定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能。解释说明:其实LSP是对开闭原则的一个扩展,在OO思想中,我们知道对象是由一系列的状态和行为组...
      99+
      2024-04-02
    • java面向对象设计原则之里氏替换原则示例详解
      目录概念实现拓展概念 里氏替换原则是任何基类出现的地方,子类一定可以替换它;是建立在基于抽象、多态、继承的基础复用的基石,该原则能够保证系统具有良好的拓展性,同时实现基于多态的抽象机...
      99+
      2024-04-02
    • C#面向对象编程中的开闭原则是什么
      这篇“C#面向对象编程中的开闭原则是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#面向对象编程中的开闭原则是什么”文...
      99+
      2023-07-02
    • C#面向对象编程中的接口隔离原则是什么
      本篇内容介绍了“C#面向对象编程中的接口隔离原则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!接口隔离原则接口隔离原则(Interfa...
      99+
      2023-07-02
    • C#面向对象编程中开闭原则的示例详解
      目录开闭原则C# 示例改进总结在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特&mi...
      99+
      2024-04-02
    • C++中的面向对象编程概念是什么
      本篇文章给大家分享的是有关C++中的面向对象编程概念是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.对象(Object),这个概念可以说是面向对象里面的最为核心的概念,...
      99+
      2023-06-17
    • C++依赖倒转原则和里氏代换原则的作用是什么
      这篇“C++依赖倒转原则和里氏代换原则的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++依赖倒转原则和里氏代换...
      99+
      2023-07-05
    • 面向对象设计的OOD原则是什么
      本文小编为大家详细介绍“面向对象设计的OOD原则是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“面向对象设计的OOD原则是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单一职责原则(SRP):一个类应当...
      99+
      2023-06-03
    • C++中面向对象编程指的是什么意思
      C++中的面向对象编程指的是一种程序设计范式,其中程序由对象组成,每个对象包含数据和操作数据的函数。面向对象编程的核心概念包括封装(...
      99+
      2024-03-11
      C++
    • PHP中的面向对象编程是什么?
      PHP是一种常用的编程语言,广泛应用于网络应用程序的开发中。在PHP的发展过程中,面向对象编程(OOP)成为其一个不可分割的组成部分。本文将介绍PHP中的面向对象编程是什么,其特点和应用场景。一、面向对象编程概述面向对象编程是一种编程范型,...
      99+
      2023-05-21
      PHP 面向对象编程 OOP
    • C#面向对象编程中依赖反转原则的示例详解
      在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马...
      99+
      2024-04-02
    • C语言面向对象编程中的封装是什么
      这篇文章主要介绍“C语言面向对象编程中的封装是什么”,在日常操作中,相信很多人在C语言面向对象编程中的封装是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言面向对象编程中的封装是什么”的疑惑有所帮助!...
      99+
      2023-06-29
    • C#面向对象编程中接口隔离原则的示例详解
      目录接口隔离原则C# 示例糟糕的示范正确的示范总结在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程...
      99+
      2024-04-02
    • Java设计模式的里氏置换原则是什么
      这篇文章主要讲解了“Java设计模式的里氏置换原则是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java设计模式的里氏置换原则是什么”吧!里氏置换原则(Liskov Substitut...
      99+
      2023-06-17
    • Java面向对象设计的六大原则是什么
      本文小编为大家详细介绍“Java面向对象设计的六大原则是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java面向对象设计的六大原则是什么”文章能帮助大家解决疑惑,下面跟...
      99+
      2024-04-02
    • 面向对象设计原则在C++中的体现
      c++++ 体现了 oop 原则,包括:封装:使用类将数据和方法封装在对象中。继承:允许派生类从基类继承数据和行为。多态:允许对象的行为根据其类型而改变,通过虚函数实现。 面向对象设计...
      99+
      2024-05-14
      c++ 面向对象
    • PHP面向对象分析设计的原则是什么
      PHP面向对象分析设计的原则是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Arthur J.Riel曾说过,你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你...
      99+
      2023-06-17
    • 面向对象编程是什么意思
      面向对象编程是一种编码设计,它使用数据来表示一组指令。它是一种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它由描述状态的属性和用来实现对象行为的方法组成,完成了从数据模型到处理模型的结合与统一。什么是面向对象编程?面向对象编...
      99+
      2023-07-17
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作