C# 6.0本质论(继承)

六、继承

6.1 派生

  • 不会继承基类的构造器以及析构器

6.1.1 自定义转换

  • 不相关类型之间也能进行转换
  • 可能转型失败或者进行有损转换时应定义显式转换操作符
6.1.1.1 隐式转换操作符
  • public static implicit operator TransTo( Class transFrom)
    • 将transFrom隐式转换为TransTo
    • TransTo A = transFrom
6.1.1.2 显式转换操作符
  • public static explicit operator
public class Person
{
	public int id { get; set; }
	public string name { get; set; }

	public static explicit operator string(Person person)
	{
		return $"id:{person.id},name:{person.name}";
	}
}
public static void Main()
{
	Person person = new Person
	{
		id = 1,
		name = "Nicholas"
	};
    string personStr = (string)person;//id:1,name:"Nicholas"
}

6.1.2 protected

  • 在基类和派生类中可访问受保护的成员,即使派生类不在同一程序集中
  • 要从派生类中访问受保护成员,必须在编译时确定是从派生类(或者某个子类)的实例中访问受保护成员
    • 对于从一个基类继承下来的两个兄弟类来说,在其中一个兄弟类中不应该能访问另一个兄弟类的受保护的成员
    • 所以当接收一个基类型的变量时需要转化为派生类才能访问受保护成员。

6.1.3 聚合

  • C#是单继承语言
    • 只能从一个类派生
  • 解决单继承问题
    • 从一个类派生,并将另一个类作为私有属性
    • 若需要利用属性类中的成员及方法,需要重新声明,并在取值、赋值以及方法调用的实现中调用相应的属性类的成员及方法(委托)
    • 若属性类中新增功能,而派生类也需要利用这些功能,则需要在派生类中再新增代码将功能公开。
public class PdaItem{
	//...
}
public class Person{
	//...
}
public class Contract:PdaItem{

	private Person InternalPerson{get;set;}
	
	public string FirstName{
		get{return InternalPerson.FirstName;}
		set{InternalPerson.FirstName=value;}
	}
}

6.1.4 密封类

  • 用sealed修饰,不能派生
  • sealed也可修饰虚成员,即禁止派生类继承该类重写的成员属性或方法
    • 重写后的属性或方法也是virtual的

6.2 基类的重写

  • 重写产生的原因
    • 基类的某些实现对于基类来说是恰当的,但对于派生类来说,可能有个性化的需求,直接使用从基类继承下来的实现可能不太合适
  • 重写的适用范围
    • 方法
    • 属性
  • “运行时”遇到虚方法时,会调用虚成员派生得最远的、重写的实现

6.2.1 virtual、override修饰符

  • 基类中标记允许重写
    • 使用virtual修饰才具备重写的能力
    • C#中默认所有都是非虚方法,即不能被派生类重写,而JAVA中默认都是虚方法
  • 派生类中进行重写
    • 应该使用override修饰
    • 若派生类不用override修饰,则相当于定义了一个与基类完全无关,但与基类方法同名的方法,其该方法会将基类的同名方法屏蔽,默认被new修饰
    • 重写后的方法也是virtual的

6.2.2 new 修饰符

  • 在派生类中生成与基类无关但同名的方法
    • 会将父类方法屏蔽
    • 无论基类方法是否用virtual修饰
  • 即使不使用new修饰符,默认也是new,但会出现警告
    • 提醒是否是忘了添加override
    • new的作用则是消除警告

6.2.3 base

  • 相当于JAVA中的super关键字
  • 可作为基类版本使用
    • 调用基类的成员或方法
  • 可在构造器中使用 :base() 调用基类构造器
    • 当基类没有可访问的默认构造方法(即无参构造)

6.3 抽象类

  • 主要作用是在派生类中共享数据和方法

6.3.1 抽象类的特点

  • 抽象类的主要特征是包含抽象成员
    • 方法被abstract修饰,派生类必须实现
    • 该方法自动为虚方法,但不能用virtual修饰
    • 抽象成员是没有实现的方法或属性
  • 派生类实现也需要用override修饰,否则默认为new

6.3.2 多态性 ploymorphism

  • 同一个签名可以有多个实现,该签名的每个实现包含在不同的类中
  • 抽象成员是实现多态性的一个手段
    • 对共有属性的一种提炼
    • 相对于普通的类继承,抽象类的出现是基类在使用过程中永远不会进行实例化的特殊情况

6.4 System.Object

在这里插入图片描述

6.5 is、as操作符

  • is
    • 判断原始类型,即创建时的类型
    • 而不是判断是否可以进行类型转换
      • 即便该类型自定义了相应的转型操作符也会返回false
  • as
    • 类型转换
      • 包括向上转型和向下转型
    • 若不能转换则返回null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#5.0本质论第四版,高清扫描的,对C#5.0技术讲的比较详细,第1章 C#概述 1 1.1 Hello,World 1 1.2 C#语法基础 3 1.2.1 C#关键字 3 1.2.2 标识符 4 1.2.3 类型定义 5 1.2.4 Main 6 1.2.5 语句和语句分隔符 7 1.2.6 空白 8 1.2.7 使用变量 8 1.2.8 数据类型 9 1.2.9 变量的声明 9 1.2.10 变量的赋值 10 1.2.11 变量的使用 11 1.3 控制台输入和输出 11 1.3.1 从控制台获取输入 11 1.3.2 将输出写入控制台 12 1.3.3 注释 14 1.3.4 托管执行和公共语言基础结构 16 1.3.5 C#和.NET版本 17 1.3.6 CIL和ILDASM 18 1.4 小结 20 第2章 数据类型 21 2.1 基本数值类型 21 2.1.1 整数类型 22 2.1.2 浮点类型 23 2.1.3 decimal类型 23 2.1.4 字面值 24 2.2 更多基本类型 27 2.2.1 布尔类型 27 2.2.2 字符类型 27 2.2.3 字符串 29 2.3 null和void 34 2.3.1 null 34 2.3.2 void 35 2.4 类型的分类 37 2.4.1 值类型 37 2.4.2 引用类型 37 2.5 可空修饰符 38 2.6 数据类型之间的转换 39 2.6.1 显式转型 39 2.6.2 隐式转型 41 2.6.3 不使用转型操作符的类型转换 42 2.7 数组 43 2.7.1 数组的声明 44 2.7.2 数组的实例化和赋值 45 2.7.3 数组的使用 48 2.7.4 字符串作为数组使用 52 2.7.5 常见数组错误 53 2.8 小结 55 第3章 操作符和控制流 57 3.1 操作符 57 3.1.1 一元操作符正和负 58 3.1.2 二元算术操作符 58 3.1.3 复合赋值操作符 64 3.1.4 递增和递减操作符 65 3.1.5 常量表达式和常量符号 68 3.2 控制流程概述 69 3.2.1 if语句 70 3.2.2 嵌套if 71 3.3 代码块 73 3.4 代码块、作用域和声明空间 74 3.5 布尔表达式 76 3.5.1 关系操作符和相等性操作符 77 3.5.2 逻辑布尔操作符 77 3.5.3 逻辑求反操作符 78 3.5.4 条件操作符 79 3.5.5 空接合操作符 80 3.6 按位操作符 80 3.6.1 移位操作符 81 3.6.2 按位操作符 82 3.6.3 按位赋值操作符 83 3.6.4 按位取反操作符 84 3.7 控制流语句(续) 84 3.7.1 while和do while循环 84 3.7.2 for循环 86 3.7.3 foreach循环 88 3.7.4 switch语句 90 3.8 跳转语句 92 3.8.1 break语句 92 3.8.2 continue语句 94 3.8.3 goto语句 95 3.9 C#预处理指令 97 3.9.1 排除和包含代码 98 3.9.2 定义预处理符号 98 3.9.3 生成错误和警告 99 3.9.4 关闭警告消息 99 3.9.5 nowarn:选项 99 3.9.6 指定行号 100 3.9.7 可视编辑器提示 100 3.10 小结 101 第4章 方法和参数 103 4.1 方法的调用 104 4.1.1 命名空间 105 4.1.2 类型名称 106 4.1.3 作用域 107 4.1.4 方法名称 107 4.1.5 形参和实参 107 4.1.6 方法返回值 107 4.1.7 语句与方法调用的比较 108 4.2 方法的声明 108 4.2.1 形式参数声明 109 4.2.2 方法返回类型声明 110 4.3 using指令 111 4.4 Main()的返回值和参数 114 4.5 方法的参数 116 4.5.1 值参数 116 4.5.2 引用参数(ref) 117 4.5.3 输出参数(out) 118 4.5.4 参数数组 120 4.6 递归 122 4.7 方法重载 124 4.8 可选参数 126 4.9 用异常实现基本错误处理 129 4.9.1 捕捉错误 130 4.9.2 使用throw语句报告错误 136 4.10 小结 138 第5章 类 139 5.1 类的定义和实例化 141 5.2 实例字段 144 5.2.1 实例字段的声明 144 5.2.2 实例字段的访问 144 5.3 实例方法 145 5.4 使用this关键字 146 5.5 访问修饰符 151 5.6 属性 153

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值