当前位置:   article > 正文

C# & Unity 面向对象补全计划 之 初识继承方法与多态

C# & Unity 面向对象补全计划 之 初识继承方法与多态

 本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正

本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝

1.继承方法

C# & Unity 面向对象补全计划 之 继承(字段与属性)-CSDN博客

本文讲述继承方法与多态性,是继承的重要伴随知识

我想实现如下内如:

有一个Computer类和一个Mycomputer类作为子类

父类提供推荐配置,而子类提出我自己的配置,并打印

1.1构造函数继承

子类构造函数会默认先调用父类构造函数

举个栗子:

Computer类:

  1. class Computer {
  2. // 公共字段
  3. public string cpu ;
  4. // 私有字段
  5. private string gpu ;
  6. // 公共属性
  7. public string gpu_name {
  8. get => gpu;
  9. set => gpu = value;
  10. }
  11. // 公共构造函数
  12. public Computer() {
  13. cpu = "7500f及以上";
  14. gpu_name = "Rx580及以上";
  15. Console.WriteLine("{0},{1}",cpu,gpu_name);
  16. }
  17. // 公共自定义方法
  18. public virtual void Configuration() {
  19. }
  20. }

当我执行Computer类的对象时,会输出如下:

子类继承: 

也可以用base关键词进行父类构造函数调用,用的不多故不做演示

  1. class MyComputer : Computer {
  2. public MyComputer() {
  3. cpu = "5600";
  4. gpu_name = "3060";
  5. Console.WriteLine("{0},{1}", cpu, gpu_name);
  6. }
  7. }

子类对象:

 输出:

如果父类构造函数是私有的话,就无法使用子类构造函数了

Q:我可以在调用子类构造函数的时候,不调用父类构造函数吗?

A:不行,因为这是语言设计的一部分,用于确保父类的成员被正确初始化

 1.2方法继承

我将Computer类添加了一个自定义方法,并将输出语句放到方法里

  1. class Computer {
  2. // 公共字段
  3. public string cpu ;
  4. // 私有字段
  5. private string gpu ;
  6. // 公共属性
  7. public string gpu_name {
  8. get => gpu;
  9. set => gpu = value;
  10. }
  11. // 公共构造函数
  12. public Computer() {
  13. cpu = "7500f及以上";
  14. gpu_name = "Rx580及以上";
  15. }
  16. // 公共自定义方法
  17. public void Configuration() {
  18. Console.WriteLine("{0},{1}", cpu, gpu_name);
  19. }
  20. }

如果子类继承以后,写一个相同名字的方法,会输出什么?

  1. MyComputer mycomputer = new MyComputer();
  2. mycomputer.Configuration();
  3. class Computer {
  4. // 公共字段
  5. public string cpu ;
  6. // 私有字段
  7. private string gpu ;
  8. // 公共属性
  9. public string gpu_name {
  10. get => gpu;
  11. set => gpu = value;
  12. }
  13. // 公共构造函数
  14. public Computer() {
  15. cpu = "7500f及以上";
  16. gpu_name = "Rx580及以上";
  17. }
  18. // 公共自定义方法
  19. public void Configuration() {
  20. Console.WriteLine("{0},{1}", cpu, gpu_name);
  21. }
  22. }
  23. class MyComputer : Computer {
  24. public MyComputer() {
  25. cpu = "5600";
  26. gpu_name = "3060";
  27. }
  28. public void Configuration()
  29. {
  30. Console.WriteLine("{0},{1}", cpu, gpu_name);
  31. }
  32. }

不会继承,所以如果不做特殊处理的话,只会调用自己的方法

所以就用到了多态,直接跳到标题3:多态下

2.多态(上)

2.1方法重载

是指可以出现同名方法,规则如下:

  1. public class Example
  2. {
  3. public void Print(int a) { }
  4. public void Print(int a, int b) { }
  5. public void Print(double a) { }
  6. public void Print(int a, double b) { }
  7. public void Print(double a, int b) { }
  8. }

2.2运算符重载 

运算符重载,一般也用的不多先用现学即可 

  1. public static Complex operator +(Complex c1, Complex c2)
  2. {
  3. return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
  4. }
  1. public static Complex operator +(Complex c1, Complex c2)
  2. {
  3. return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
  4. }

3.多态(下)

3.1虚方法(可以不重写)

在C#中,虚方法(virtual method)是指在基类中声明并可以在派生类中重写的方法

虚方法使用 virtual 关键字进行声明:

  1. public virtual void Configuration() {
  2. Console.WriteLine("推荐配置为{0},{1}", cpu, gpu_name);
  3. }

子类可以使用override关键字进行重写,并且添加逻辑:

  1. public override void Configuration()
  2. {
  3. Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);
  4. Console.WriteLine("打印完毕");
  5. }

调用:

  1. Computer computer = new Computer();
  2. computer.Configuration();
  3. MyComputer mycomputer = new MyComputer();
  4. mycomputer.Configuration();

结果:

3.2抽象方法(强制重写)

抽象方法没有方法体,只包含在抽象类之中,只有方法签名,它们必须在派生类中实现

举个栗子:电脑这一概念的确就符合抽象的概念

  1. abstract class Computer {
  2. // 公共字段
  3. public string cpu ;
  4. // 私有字段
  5. private string gpu ;
  6. // 公共属性
  7. public string gpu_name {
  8. get => gpu;
  9. set => gpu = value;
  10. }
  11. // 公共构造函数
  12. public Computer() {
  13. cpu = "7500f及以上";
  14. gpu_name = "Rx580及以上";
  15. }
  16. // 公共自定义方法
  17. public abstract void Configuration();
  18. }

子类继承的话,则强制进行方法重写:

  1. public override void Configuration()
  2. {
  3. Console.WriteLine("我的配置为{0},{1}", cpu, gpu_name);
  4. Console.WriteLine("打印完毕");
  5. }

二者区别

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/919375
推荐阅读
相关标签
  

闽ICP备14008679号