C# 学习笔记(5) 继承

我们可能会在一些类中,写一些重复的成员,继承就是为了避免重复写这些成员,将这些成员
单独的封装到一个类中,作为这些类的父类。一个类在需要这些重复的成员时,直接继承父类,这些重复的成员就可以省去不写。

单根性

一个子类只能有一个父类, object是所有类的老祖先。

传递性

父类可以传递给子类什么?

  • 父类会将自己的属性和方法传递给子类,但是私有字段不会传递给子类。

子类有没有继承父类的构造函数?

  • 子类不会继承父类的构造函数,但是在创建子类时会默认先调用父类的无参构造函数创建一个父类对象,然后再调用子类的构造函数,也就是说子类中其实包含了一个父类,所以表面上子类会有父类的公共属性和方法,而父类的私有字段则因为访问权限问题子类访问不到。
    class Program{static void Main(string[] args){Student student = new Student();student.Eat();Console.ReadKey();}}public class Person{public string Name;public int Age;public bool Gender;public Person(){Console.WriteLine("人类构造函数");}public void Eat(){Console.WriteLine("父类吃饭吃两碗");}}class Student : Person{public Student(){Console.WriteLine("子类构造函数");}}
  • 上面代码会输出:

      人类构造函数子类构造函数父类吃饭吃两碗
    
  • 由于子类会默认调用父类的无参构造函数,如果自己在父类中写了带参的构造函数最好在写一个无参的构造函数方便子类调用(如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,子类就调用不到了,所以子类会报错。)

  • 如果想要子类的构造函数调用父类特定的构造函数需要使用关键字:base()

如果类中的构造函数想调用类中另一个构造函数,需要使用关键字:this()

    class Program{static void Main(string[] args){Student student = new Student();student.Eat();Console.ReadKey();}}public class Person{public string Name;public int Age;public bool Gender;public Person(){Console.WriteLine("人类构造函数");}public Person(int age){this.Age = age;Console.WriteLine("人类构造函数 人类年纪:{0}", this.Age);}public void Eat(){Console.WriteLine("父类吃饭吃两碗");}}class Student : Person{public Student():base(50){Console.WriteLine("子类构造函数");}}
  • 上面代码会输出:

      人类构造函数 人类年纪:50子类构造函数父类吃饭吃两碗
    

子类中的属性或者方法和父类中的重名会怎么样?

一般来说是禁止子类与父类中的属性与方法重名的,重名时编译器会提示警告,但是可以在子类重名的属性或者方法前添加new关键字,这样子类的属性或者方法就会屏蔽掉父类的重名属性或者方法,这时候如果想调用被屏蔽掉的父类属性或方法,需要使用关键字base. 调用

    class Program{static void Main(string[] args){Student student = new Student();student.Eat();Console.ReadKey();}}public class Person{public string Name;public int Age;public bool Gender;public Person(){Console.WriteLine("人类构造函数");}public Person(int age){this.Age = age;Console.WriteLine("人类构造函数 人类年纪:{0}", this.Age);}public void Eat(){Console.WriteLine("父类吃饭吃两碗");}}class Student : Person{public Student():base(50){Console.WriteLine("子类构造函数");}public new void Eat(){Console.WriteLine("子类吃饭吃两碗");}}
  • 上面代码会输出:

      人类构造函数 人类年纪:50子类构造函数子类吃饭吃两碗
    

里氏转换

1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。

里氏替换原则

子类可以扩展父类的功能,但不能改变父类原有的功能。

为什么子类不要更改父类原有功能?
假如有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时重写了父类A中的方法,而该方法有可能是用来实现P1功能的,重写后P1功能可能发生故障。因此当使用继承时,里氏替换原则要求类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

C# 学习笔记(5) 继承相关推荐

  1. C++学习笔记13-类继承

    1.  类模板的 static 成员[不同于C#中的static] 类模板能够像随意其它类一样声明static 成员.下面代码: template <class T> class Foo ...

  2. Java学习笔记3——继承

    继承 继承的好处:子类拥有父类的所有属性和方法,peivate修饰的无效:实现代码复用 class 子类 extends 父类 例如: class Dog extends Animal{...... ...

  3. 《Java 核心技术卷1 第10版》学习笔记------ 组织继承:final类和方法【编译器优化:内联( inlining );】

    使用 final 关键字阻止继承 有时候,可能希望阻止人们利用某个类定义子类.不允许扩展的类被称为 final 类.如果在定义类的时候使用了 final 修饰符就表明这个类是 final 类. 例如, ...

  4. c++学习笔记之继承和多态

    1.public 继承 class A : public B (1)友元函数不能被继承 (2)protected成员可以被派生类和友元访问 2.派生类 (1)派生类构造函数如果未显式调用基类构造函数, ...

  5. Java学习笔记_继承

    继承的格式 在继承关系中,"子类就是一个父类".也就是说,子类可以被当作父类看待 例如父类是员工,子类是讲师,那么"讲师就是一个员工" 定义父类的格式:(一个普 ...

  6. c++学习笔记(13) 继承和多态

    继承:从已有的类派生出新类 基类和派生类 不同的类之间可能有很多共通的属性和行为,这些属性和行为允许在一个类中通用化并被其他类所共享.类C1从类C2扩展而来,则C1称为派生类,C2称为基类,基类也称为 ...

  7. Spring攻略学习笔记(13)------继承Bean配置

    一:知识点 在Spring IoC容器中配置Bean时,可能拥有一个以上的共享某些公用配置的Bean,比如属性和<bean>元素中的属性.你常常需要为多个Bean重复这些配置. Sprin ...

  8. java学习笔记七——继承

    子类继承父类后子类就拥有父类的属性和方法 class a { } class b extends a { } b继承了a 转载于:https://www.cnblogs.com/huanghai/ar ...

  9. 【python面向对象学习笔记】继承

    继承 # 继承 class Animal:atype="哺乳动物"def __init__(self,name,age,sex) -> None:self.name=name ...

  10. 黑马程序员学习笔记 关于继承

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

最新文章

  1. 字符串声明太大出现错误_搜索框输入中文出现单引号报错问题
  2. Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]
  3. linux下的PHP+Mysql+PHPWind实现
  4. Smart Form中打印图标或符号
  5. Java学习笔记(基本数据类型和变量命名规则)
  6. ibm服务器无显示器,IBM 2128彩色显示器,无论有无连机信号输入均黑屏
  7. 顶级的CSS和Javascript动画框架
  8. Java solrj client 添加JavaEntity Bean
  9. js加html连线实现流程,(jsPlumb开发入门教程实现html5拖拽连线.doc
  10. python np float_Python astype(np.float)函数使用方法解析
  11. 鸡啄米:C++编程入门系列之三(VS2010的使用介绍)
  12. 软工网络15个人阅读作业2 201521123023 网络1511 戴建钊
  13. Google play billing(Google play 内支付) 上篇
  14. 输入密码三次,简单程序
  15. ASP.NET Core 和 EF Core系列教程——CRUD
  16. position: -webkit-sticky; /* for Safari */ position: sticky;
  17. VirusTotal
  18. Jackson Cannot deserialize value of type `xxx` from String “xxx“ : Failed to deserialize xxx问题解决
  19. 都说大数据就业好,为什么数据分析这么难就业?
  20. 3.3.9 反相积分电路

热门文章

  1. SQL Server 个人手册
  2. iOS9临时性解决HTTP以及scheme跳转问题
  3. Best Practices for Web Apps
  4. 没有日志,只有MDF文件如何恢复数据库(转)[
  5. 华为2288H V5服务器 RAID操作
  6. 关于耳机的国标和美标的区分
  7. 技术团队的情绪与效率
  8. 将SVN与BUG跟踪管理集成
  9. smartform四联纸跳页问题
  10. window下建立vue.js项目