派生类

C# 读书笔记之访问虚方法、重写方法和隐藏方法

a 夏天 提交于 2020-04-07 05:34:51
C#允许派生类中的方法与基类中方法具有相同的签名:基类中使用关键字virtual定义虚方法;然后派生类中使用关键字override来重写方法,或使用关键字new来覆盖方法(隐藏方法)。 重写方法用相同的签名重写所继承的虚方法。 虚方法 声明用于 引入新方法 ,而 重写方法或隐藏方法 声明则是用于使现有的 继承虚方法专用化( 通过提供该方法的新实现 ) 注意:如果签名相同的方法在基类和派生类都进行了声明,但该方法没有声明为virtual和override/new,则派生类方法就会隐藏基类方法,但系统编译时会产生警告信息。因为隐藏方法会存在为给定类的实例调用错误方法的危险,故应该显示地定义隐藏方法。 调用虚方法时,将首先检查该对象的运行时类型,并调用派生类中的该重写成员。如果没有派生类重写该成员,则调用其原始数据。 默认情况下,C#方法是非虚拟的。 不能重写非虚方法 ,重写非虚方法将导致编译错误。 除了类方法外,还可以使用virtual关键字其他类成员以定义虚成员,包括属性【无参属性】、索引器【含参属性】或事件声明。虚拟成员的实现可在派生类使用关键字override来重写;或使用关键字new来覆盖。 注意:virtual 修饰符不能与static、abstract、private或override修饰符一起使用。 例: 虚方法,重写方法和隐藏方法示例:Dimensions类包含x

C#中virtual 方法和abstract方法的区别

两盒软妹~` 提交于 2020-04-07 03:43:43
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别。二者都牵涉到在派生类中与override的配合使用。 一、Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。 二、Abstract方法(抽象方法) abstract关键字只能用在 抽象类 中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。 来源: https://www.cnblogs.com/max007super/archive/2009/02/09/1386980.html

[golang note] 匿名组合

∥☆過路亽.° 提交于 2020-04-06 19:15:58
匿名组合 golang也提供了继承机制,但采用组合的文法,因此称为匿名组合。与其他语言不同, golang很清晰地展示出类的内存布局是怎样的。 • 非指针方式组合 ▶ 基本语法 // 基类 type Base struct { // 成员变量 } func (b *Base) 函数名(参数列表) (返回值列表) { // 函数体 } // 派生类 type Derived struct { Base // 成员变量 } func (b *Derived) 函数名(参数列表) (返回值列表) { // 函数体 } ▶ 继承规则 √ 在派生类没有改写基类的成员方法时,相应的成员方法被继承。 √ 派生类可以直接调用基类的成员方法,譬如基类有个成员方法为Base.Func(),那么Derived.Func()等同于Derived.Base.Func() √ 倘若派生类的成员方法名与基类的成员方法名相同,那么基类方法将被覆盖或叫隐藏,譬如基类和派生类都有成员方法Func(),那么Derived.Func()将只能调用派生类的Func()方法,如果要调用基类版本,可以通过Derived.Base.Func()来调用。 ▪ 示例如下 package main import "fmt" type Base struct { } func (b *Base) Func1() { fmt

第五章 继承与派生

徘徊边缘 提交于 2020-04-04 16:43:24
目录 基本概念 继承关系&复合关系 protected保护成员 派生类的构造函数 public继承的赋值兼容性规则 基本概念 继承和派生是一个概念 当新类(派生类)与已有类(基类)具有相似的特性(包含已有类所有特性),则可以通过继承获得已有类的全部对象。 继承是对原有对象的复用,同时在此基础上进行修改(覆盖)与扩充。 派生类会继承基类的所有成员(private、protected、public),但派生类成员函数无法访问基类的private成员 继承方式: class 派生类名:访问属性 基类名{} 存储空间: 派生类中新声明的成员,其存储空间位于继承的基类成员存储空间之后 派生类成员覆盖基类成员后,成员函数可通过 基类名::基类成员名 调用被覆盖的基类成员(一般不会覆盖基类成员变量,而是覆盖成员函数) 继承关系&复合关系 继承逻辑(“是”): 派生类是一种基类(如狗是动物) 复合逻辑(“有”): 如果类A是类B的成员对象,则类B包含类A,类A是类B的一种固有属性或组成部分 class Point{ double x,y; } class Circle{ //不用继承,而采用复合关系 Point center; double r; } 复合关系的另一种情况: class Master; class Dog{ Master *m; } class Master{ Dog *dog

子类继承基类的三种继承方式

与世无争的帅哥 提交于 2020-04-02 05:33:00
在C++中,子类继承父类有三种继承方式,分别是:public, protected和private。子类继承的方式不同,那么子类对象访问父类中的参数访问权限也不同。 public 方式继承 :基类的private成员派生类不可见,基类中的protected和public成员在派生类中可以直接使用,并且变成了派生类中相应 的protected成员和public成员,但是只有public成员可以在派生类外使用。 protected 方式继承 :基类的private成员派生类不可见,基类的protected成员和public成员变成派生类的protected成员,这时在派生类 外不能使用基类的所有成员,包括public成员。  private 方式继承 :基类的private成员仍然为私有的,派生类不可见,基类中的protected成员和public成员成为了派生类中的private成 员,在派生类外不能使用基类中的任何成员。 下面我们通过例子来解释上面的说法: class A { public: int m_public; protected: int m_protected; private: int m_private; }; class B :public A { void SetPublic(int nPublic) { m_public = nPublic; /

难免的尴尬:代码依赖

只愿长相守 提交于 2020-03-30 16:47:33
相关文章连接 动力之源:代码中的泵 高屋建瓴:梳理编程约定 编程之基础:数据类型(一) 编程之基础:数据类型(二) 可复用代码:组件的来龙去脉 重中之重:委托与事件 物以类聚:对象也有生命 难免的尴尬:代码依赖 12.1 从面向对象开始 12.1.1 对象基础:封装 12.1.2 对象扩展:继承 12.1.3 对象行为:多态 12.2 不可避免的代码依赖 12.2.1 依赖存在的原因 12.2.2 耦合与内聚 12.2.3 依赖造成的尴尬 12.3 降低代码依赖 12.3.1 认识抽象与具体 12.3.2 再看“依赖倒置原则” 12.3.3 依赖注入 12.4 框架中的“代码依赖” 12.4.1 控制转换 12.4.2 依赖注入对框架的意义 12.5 本章回顾 12.6 本章思考 在浩瀚的代码世界中,有着无数的对象,跟人和人之间有社交关系一样,对象跟对象之间也避免不了接触,所谓接触,就是指一个对象要使用到另外对象的属性、方法等成员。现实生活中一个人的社交关系复杂可能并不是什么不好的事情,然而对于代码中的对象而言,复杂的"社交关系"往往是不提倡的,因为对象之间的关联性越大,意味着代码改动一处,影响的范围就会越大,而这完全不利于系统重构和后期维护。所以在现代软件开发过程中,我们应该遵循"尽量降低代码依赖"的原则,所谓尽量,就已经说明代码依赖不可避免。 有时候一味地追求"降低代码依赖

c# 多态性

天涯浪子 提交于 2020-03-28 22:55:44
首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是 多态性 。 多态性 通过派生类覆写基类中的虚函数型方法来实现。 多态性 分为两种,一种是编译时的 多态性 ,一种是运行时的 多态性 。 编译时的 多态性 :编译时的 多态性 是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的 多态性 :运行时的 多态性 就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的 多态性 是通过覆写虚成员实现。 下面我们来分别说明一下多态中涉及到的四个概念:重载,覆写,虚方法和抽象方法。 重载和覆写的区别: 重载 类中定义的方法的不同版本 public int Calculate(int x, int y) public double Calculate(double x, double y) 特点(两必须一可以) 方法名必须相同 参数列表必须不相同 返回值类型可以不相同 覆写 子类中为满足自己的需要来重复定义某个方法的不同实现。 通过使用override关键字来实现覆写。 只有虚方法和抽象方法才能被覆写。 要求(三相同) 相同的方法名称 相同的参数列表 相同的返回值类型 最后再来介绍一下虚方法和抽象方法 虚方法: 声明使用virtual关键字。 调用虚方法

sealed、new、virtual、abstract与override 总结

≯℡__Kan透↙ 提交于 2020-03-27 09:53:18
1. sealed——“断子绝孙” 密封类不能被继承。密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed修饰符必须始终与override一起使用。 即:密封类不会有子类,所以是“断子绝孙”。 2. new——“你是我的,我是我的” new关键字用于显式隐藏从基类继承的成员。也就是在使用派生类时调用的方式方法是new关键字新定义出来的方法,而不是基类的方法。 在不使用new修饰符的情况下隐藏成员是允许的,但会生成警告。使用new显式隐藏成员会取消此警告,并使用派生类新定义的方法。 即:好比是不用祖宗的东西,而是用自己创造(new)的东西。 3. virtual——“为了子孙后代” virtual关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称做虚成员。虚成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 在默认情况下,方式是非虚拟的。非虚方法不能重写。 不能将virtual修饰符与一下修饰符一起使用:static、abstract和override。 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。 在静态属性上使用virtual修饰符是错误的。 通过override修饰符的属性声明

.NET MVC 过滤器执行顺序

北慕城南 提交于 2020-03-27 00:26:04
3 月,跳不动了?>>> 以下内容抄自 博客园 : .net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionFilter(OnActionExecuting)---->控制器Action---->IActionFilter(OnActionExecuted) ---->IResultFilter(OnResultExecuting)---->视图---->IResultFilter(OnResultExecuted) Filter的具体生存周期 : 来自controller虚方法 的OnActionExecuting . 应用于当前Controller的Filter中的OnActionExecuting: 先执行基类的,后执派生类的 执行应用于Action的Filter的OnActionExecuting顺序: 先执行基类的,后执派生类的 Action 方法 应用于Action的Filter的OnActionExecuted 的执行顺序 先执行派生类的,后执行基类的 应用于当前Controller的Filter中的OnActionExecuted方法 先执行派生类的,后执行基类的 Controller中的虚方法 OnActionExecute 以下为自己的内容: 上面写的顺序是系统接口的执行顺序

C++的类和对象--权限public-private-protected

ぃ、小莉子 提交于 2020-03-22 22:42:24
  类是一种将抽象转换为用户自定义类型的C++工具,它将 数据表示(基本成员)和操作数据的方法(成员函数) 组合成一个整洁的包   两个表格有由自己整理,其他参考自: http://blog.163.com/clevertanglei900@126/blog/static/1113522592010114102759821/    当private,public,protected单纯的作为一个类中的成员权限设置时:    C++的类和对象的权限1 权限 类内部 该类对象 子类(派生类) 友元函数 private 可访问  不可访问   不可访问 可访问 public 可访问 可访问 可访问 可访问 protected 可访问 不可访问  可访问 可访问   private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.    protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但 不能被该类的对象 访问   public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问   注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数    当private,public,protected作为继承方式时: C++的类和对象的权限2(相对于基类成员) 继承方式 基类对象 派生类 派生类对象