首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编码最佳实践——里氏替换原则

更好的方式是,在基类中控制字段的可见性并只允许引入防卫子句的属性设置器访问该字段,将来所有的子类都不再需要防卫子句检查。...在C#语言中,变体的实现有协变和逆变两种。 协变 下图展示了一个非常小的类层次结构,包含了基(超)类Supertype和子类Subtype。 多态是一种子类型被看做基类型实例的能力。...具体到实现层面,定义中没有对in和out关键字的引用,这二者分别用来指定逆变和协变。C#语言的方法参数类型和返回类型都是不可变的,只有在设计泛型时才能将类型定义为可协变的或可逆变的。...捕获异常后不做任何处理或只捕获最通用的Exception基类都是不可取的,二者结合就更糟糕了。从SystemException派生出来的异常基本都是根本无法处理和恢复的情况。...需要理解契约和变体的概念才可以应用Liskov替换原则编写具有更高自适应能力的代码。理想情况下,不论运行时使用的是哪个具体的子类型,客户端都可以只引用一个基类或接口而无需担心行为变化。

1.3K20

C# 9.0 中的新增功能

默认情况下,记录是不可变的。 使用记录类型可在 .NET 中轻松创建不可变的引用类型。 以前,.NET 类型主要分为引用类型(包括类和匿名类型)和值类型(包括结构和元组)。...合成的 GetHashCode 使用基类型和记录类型中声明的所有属性和字段中的 GetHashCode。 这些合成方法在整个继承层次结构中强制执行基于值的相等性。...在完成所有初始化(包括属性初始化表达式和 with 表达式)之后,构造阶段实际上就结束了。 上述位置记录示例演示了如何使用仅限 init 的资源库通过 with 表达式来设置属性。...CS8852. now.TemperatureInCelsius = 18; 对于从派生类设置基类属性,仅限 init 的资源库很有用。 它们还可通过基类中的帮助程序来设置派生属性。...协变返回类型为替代函数的返回类型提供了灵活性。 替代的虚函数可返回从基类方法中声明的返回类型派生的类型。 这对于记录和其他支持虚拟克隆或工厂方法的类型很有用。

1.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# 9.0新特性介绍

    默认情况下,记录是不可变的。 使用Record类型可在 .NET 中轻松创建不可变的引用类型。 以前,.NET 类型主要分为引用类型(包括类和匿名类型)和值类型(包括结构和元组)。...合成的 GetHashCode 使用基类型和记录类型中声明的所有属性和字段中的 GetHashCode。 这些合成方法在整个继承层次结构中强制执行基于值的相等性。...在完成所有初始化(包括属性初始化表达式和 with 表达式)之后,构造阶段实际上就结束了。 上述位置记录示例演示了如何使用仅限 init 的资源库通过 with 表达式来设置属性。...CS8852.now.TemperatureInCelsius = 18; 对于从派生类设置基类属性,仅限 init 的资源库很有用。 它们还可通过基类中的帮助程序来设置派生属性。...协变返回类型为替代函数的返回类型提供了灵活性。替代的虚函数可返回从基类方法中声明的返回类型派生的类型。这对于记录和其他支持虚拟克隆或工厂方法的类型很有用。

    2K20

    Java泛型可行与不可行

    new 来创建泛型类型的具体对象,最好的方案是使用 Class.newInstance()或者使用工场模式 public T getNewInstance() { // return new...List与InterfaceA的泛型参数要兼容,否则也会出错 void testMethod(); } 通配符 通配符在泛型中的应用是为了解决下面的问题:有一个容器的泛型是基类的变量,想要将一个泛型是子类的容器赋值给这个变量...,编译器是不允许的;因为运行时会将泛型擦除,一旦将一个泛型是子类的容器赋值给泛型是基类的容器变量,在运行时就可以将一个这个基类的其他子类对象放入这个窗口,造成在取出对象时的类型不安全,所以编译期不允许这样赋值...上面的例子,泛型入参方法不能用了,而逆变的特性是入参可以是任何Apple 的子类,注意是子类,不是基类,因为Apple 的基类有多种,如果编译器允许传入基类,就会存在风险,但是传入子类就不会有风险,因为子类可以转型为...> 当一个地方要求泛型,如果你没有给出泛型,会有警告,但使用无界通配符会消除警告 无界通配符与原生类型是不一样的,以List 和List<?

    35630

    认真CS☀️协变、逆变 & 不变

    ,他们是平级关系,不是父子关系,自然他们定义的变量无法相互赋值,即使它们的变量引用的对象是父子关系,可以赋值的,它们的变量也不可以赋值 1、我们不将dog赋值给animal(dog是Factory变的 逆变:在类型参数前加in 基类对象的引用期望的是传入到基类对象,但实际上(也允许它)传入到派生对象,这叫做逆变 这样可以工作,因为在调用的时候,调用代码传入了派生类型的变量...,方法期望的只是其基类,方法完全可以像以前那样操作对象的基类部分 “逆变”则是指能够使用派生程度更小的类型。...协变(out)是将派生类对象的引用传入到基类对象,输出派生类的值 逆变(in)是将基类对象的引用传入到派生对象,派生对象只能操作基类部分 接口的协变和逆变 1️⃣ 接口的协变 using System...因此变化只是用于引用类型,不能从值类型派生其他类型 b、显式变化使用in和out关键字只适用于委托和接口,不适用于类、结构和方法 c、不包括in、out关键字的委托和接口类型参数叫不变。

    10310

    SQL命令 INSERT(一)

    它将%ROWCOUNT变量设置为受影响的行数(始终为1或0)。 带有SELECT的INSERT会向表中添加多个新行。...尝试使用不可更新的视图或子查询进行插入会生成SQLCODE-35错误。 不能在表参数中指定表值函数或联接语法。...必须为每个用户可指定的基表列指定值;不能使用定义的默认值。(当然,可以指定空字符串作为列值。) 显示到逻辑数据的转换 数据以逻辑模式格式存储。...大多数其他数据(如字符串和数字)不需要转换;无论当前模式如何,它们都以相同的格式输入和存储。...查询可以使用LENGTH或$LENGTH函数确定是否存在非显示字符。 特殊变量 可以在列中插入以下特殊变量的值: %TABLENAME或%CLASSNAME伪字段变量关键字。

    6K20

    14 Java IO流

    , 输出流 IO流常用基类 字节流的抽象基类对象: InputStream, OutputStream 字符流的抽象基类对象: Reader, Writer 注:有这四个类派生出来的子类名称都是由其父类名作为子类名的后缀...fw.close(); //与flush的区别: flush刷新后流可以继续使用,close却将流关闭,不可再写入 } IO异常的标准处理方式一(以FileWriter为例)...装饰模式比继承要灵活,避免了继承体系臃肿.而且降低了类与类之间的关系,装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能.所以装饰类和比装饰类通常是都属于一个体系中....另外非静态成员变量可以transient修饰不被序列化,同样类(static)变量也不会序列化....“ r”表示只读模式; “ rw”表示读 / 写模式; “ rws”表示每次更新时,都对数据和元数据的写磁盘操作进行同步的读 / 写模式; “ rwd”表示每次更新时,只对数据的写磁盘操作进行同步的读

    42920

    【C++深度探索】:继承(定义&&赋值兼容转换&&作用域&&派生类的默认成员函数)

    (成员变量+成员函数),不过是把父类的成员变量拷贝给子类,并不指向同一个,子类中可以使用父类的成员变量,在子类里的改变不影响父类,但是成员函数是同一个。...同时,访问限定符可以用于类的成员变量和成员函数的声明中,默认情况下,成员变量和成员函数的访问限定符是private。...成员 派生类的protected成员 派生类的protected成员 派生类的private成员 基类的private成员 在派生类中不可见 在派生类中不可见 在派生类中不可见 总结如下: ①基类private...子类和父类中可以有同名成员变量,因为它们属不同的类域,同一类里不可以。 (4) 注意在实际中在继承体系里面最好不要定义同名的成员。...个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?

    14510

    C Sharp(七)

    C Sharp(七) 發佈於 2018-10-28 这一篇,我们讲讲 C# 中的数组对象及其协变概念。 概述 ---- 数组是由变量名表示的一组同类型的数据元素,每个元素可以通过索引来访问。...C# 数组的特点: C# 不支持动态数组,也就是数组一旦创建,就不可以更改大小 索引从 0 开始 数组类型 C# 支持一维数组和多维数组,多维数组又分为矩形数组和交错数组。...一维数组 我们可以在类型和变量名之间加中括号来声明一维数组: long[] array; 要实例化一维数组,我们使用数组创建表达式,使用 new 操作符,后跟基类名称和中括号,中括号里要有数组长度:...协变是指: 即使某个对象不是数组的基类型,我们也可以把他赋值给数组元素。...以下情况可以使用数组协变: 数组是引用类型数组 赋值类型和数组基类类型存在显式或隐式转换 由于基类和派生类总存在隐式转换,因此我们可以把派生类对象赋值给基类型数组元素: class A {} class

    80610

    C# 发展历史及版本新功能介绍

    指定基类的所有部分必须一致,但忽略基类的部分仍继承该基类型。 各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。...处理数据库和其他包含不可赋值的元素的数据类型时,能够将 null 赋值给数值类型和布尔类型会特别有用。 例如,数据库中的布尔字段可以存储值 true 或 false,也可以处于未定义状态。...这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。 Covariance 使你能够使用比原始指定的类型派生程度更大的类型。...泛型协变和逆变提供了更强的功能来使用泛型,但风格比较偏学术,应该最受框架和库创建者的喜爱。 命名参数和可选参数帮助消除了很多方法重载,让使用更方便。 但是这些功能都没有完全改变模式。...以下介绍了部分新增功能: Out 变量 元组和析构函数 模式匹配 本地函数 已扩展 expression bodied 成员 Ref 局部变量和返回结果 这些都为开发者提供了很棒的新功能,帮助编写比以往任何时候都简洁的代码

    4.2K20

    新生命开发团队Orm框架XCode v3.5.2009.0714源码发布(圣诞随心大礼包)

    人继续变老,程序继续改进。     这段时间从我们各个系统抽取了基础的常用的部分,整理后形成了一个XCode示例项目,包含三部分:DLL引用程序集、Web网站、YWS实体类库。    ...当然,面向对象中的抽象和虚拟也可以抽象,但是我们这里通过泛型基类,还可以抽象静态方法的实现,这也是我们大量使用泛型基类的原因。    ...菜单和权限页面的树形结构,有几个特点:没有使用路径字段,只有简单的ParentID字段;菜单互相嵌套不会死循环,使用栈代替递归构造菜单树;不会大量读取数据库,因为有实体缓存,不仅缓存了每一个实体,还缓存了整颗树...Sort,可用于多个字段排序 * 修复快速访问方法、属性和字段所存在的问题,在实体基类索引器使用 * * v5.9.2010.1020 修正Database...* * v3.0.2009.0608 元数据类Meta增加一个字段名列表属性FieldNames * 调整DatabaseSchema类,新增字段时,直接设置默认值

    1.6K70

    MySQL 慢查询、 索引、 事务隔离级别

      慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表   默认的阈值(long_query_time)是 10,这个显然不可用,通常,对于用户级应用而言,我们将它设置为 0.2...关于变量的说明  ** 修改变量可以使用命令:setglobal long_query_time =0.2; (更常见的做法是修改 MySQL 的配置 my.cnf) **   ** 日志记录到系统的专用日志表中...-v:详细模式。...索引类型及操作 索引类型  普通索引 这 是 最 基 本 的 索 引 类 型 , 支 持 单 列 和 多 列 。...隔离级别的设置 注 意 : 不 同 的 M y S Q L 版 本 , 事 务 隔 离 级 别 对 应 的 变 量 名 也 是 不 同 的 。 ?

    2.8K50

    03.Scala:样例类、模式匹配、Option、偏函数、泛型

    Scala:样例类、模式匹配、Option、偏函数、泛型 课程目标 掌握样例类的使用 掌握模式匹配的使用 1....示例 需求说明 创建两个样例类Customer、Order Customer包含姓名、年龄字段 Order包含id字段 分别定义两个案例类的对象,并指定为Any类型 使用模式匹配这两个对象,并分别打印它们的成员变量值...答案是: 不可以的。要支持模式匹配,必须要实现一个提取器。 [!...,包含姓名年龄两个字段 实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。...接下来,我们来学习如何定义scala的泛型类 定义 语法格式 class 类[T](val 变量名: T) 定义一个泛型类,直接在类名后面加上方括号,指定要使用的泛型参数 指定类对应的泛型参数后,就使用这些类型参数来定义变量了

    2.1K20

    Java高质量面试总结

    常见的类加载 Java类的初始化顺序 Java类的初始化顺序: 基类静态代码块,基类静态成员变量(并列优先级,按照代码中出现的先后顺序执行,并且只有第一次加载时执行) 派生类静态代码块,派生类静态成员变量...(并列优先级,按照代码中出现的先后顺序,并且只有第一次加载时执行) 基类普通代码块,基类普通成员变量(并列优先级,按照代码中出现的先后顺序执行) 基类构造函数 派生类普通代码块,派生类普通成员变量(并列优先级...JVM Java类的初始化顺序? Java类的初始化顺序: 基类静态代码块,基类静态成员变量....并列优先级,按照代码中出现的先后顺序执行,并且只有第一次加载时执行 基类普通代码块,基类普通成员变量. 并列优先级,按照代码块中出现的先后顺序执行 基类构造函数....局部变量在使用之前需要显式赋予初始值 javac不是推断不出不可以这样做,对于成员变量而言,其赋值和取值访问的先后顺序具有不确定性,对于一个成员变量可以在一个方法调用前赋值,也可以在方法调用后进行赋值,

    47311

    Scala:样例类、模式匹配、Option、偏函数、泛型(三)

    Scala:样例类、模式匹配、Option、偏函数、泛型 课程目标 掌握样例类的使用 掌握模式匹配的使用 1....示例 需求说明 创建两个样例类Customer、Order Customer包含姓名、年龄字段 Order包含id字段 分别定义两个案例类的对象,并指定为Any类型 使用模式匹配这两个对象,并分别打印它们的成员变量值...答案是: 不可以的。要支持模式匹配,必须要实现一个提取器。 [!...,包含姓名年龄两个字段 实现一个类的解构器,并使用match表达式进行模式匹配,提取类中的字段。...接下来,我们来学习如何定义scala的泛型类 定义 语法格式 class 类[T](val 变量名: T) 定义一个泛型类,直接在类名后面加上方括号,指定要使用的泛型参数 指定类对应的泛型参数后,就使用这些类型参数来定义变量了

    2.4K20

    C++:继承与派生

    Student是子类,也称作派生类 2、继承关系和访问限定符 我们会发现继承方式和访问限定符都存在公有、保护、私有这三种继承模式。...(但是有些情况下不可避免,后面会说) 四、派生类的默认成员函数 6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?...设置一个静态成员变量,然后在基类的构造函数里++ 如上图,我们可以发现如果把静态成员设为公有,那么就会出现可以修改的情况,所以我们最好把静态成员变量设成私有,然后用写一个静态成员函数getcount去获取结果...2、如何实现一个不能被继承的类 ? 将基类的构造函数藏在私有作用域里,这样继承的时候子类不可见基类构造函数,就无法创建出子类对象了!...结论:优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。

    18810

    设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern)。...一、使用“类图”分析鲜花+花瓶的装饰关系 与之前博客的风格类似,我们还是依托于实例来理解“装饰者模式”,我们就依托于花瓶与鲜花的关系来理解一下装饰者模式。...下方的类图就是我们将要实现的“装饰者模式”的实例,也就是鲜花和花瓶的关系。...下方我们会一步步的给出代码具体实现,当然下方的类名,成员变量以及成员方法的命名与上述类图一直。...当然我们仍然使用procelain变量来接收添加Rose修饰后的对象(也就是Rose类的对象),此时Rose类的对象代表着“插有玫瑰花的瓷花瓶”。

    67090

    java中关于set()和get()方法的理解和使用

    示例 1此例说明如何访问基类中被派生类中具有同一名称的另一个属性隐藏的属性。 ...Name 隐藏基类中的属性 Name。...在这种情况下,派生类的该属性声明使用 new 修饰符: public new string Name { …转换 (BaseClass) 用于访问基类中的隐藏属性: ((BaseClass)d1).Name...而不是直接对类的变量进行操作.有一个很大的作用就是: 便于维护.因为:如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,如果直接对变量a操作的话,就得需求修改整个程序的...满足一定条件让GET和SET来改变类中的私有变量,而不能让实例直接操作。像上面的代码保证了color属性的安全性。

    4K30

    Delphi类型和引用

    要访问对象的某个字段,跟访问记录变量中的字段类似,是用对象名加小圆点和字段名。...八:构造和析构 构造和析构是类类型中两种特殊的方法,用于控制类的对象如何创建和初始化,如何删除等行为。一个类 可以没有也可以有多个构造和析构,构造和析构也可以继承。...这是因为私有字段在 类外部是不可见的,则用户修改属性时,即可内部处理一些私有字段达到完美封装的目的。在Delphi4 中,有一个新特性称为类补全。...除此之外,你还可以使用一个返回 类型与属性数据类型一样的函数来读取它的值。这和设置值是一样的。...Private 在Private部分声明的成员是私有的,它们只能被同一个类中的方法访问,相当于C语言中的内部变 量,对于其它类包括它的派生类,Private部分声明的成员是不可见的,这就是面向对象编程的数据保护

    2.5K30
    领券