zoukankan      html  css  js  c++  java
  • C#基础知识-面向对象思想之继承(八)

    上一篇的标题编程思想我觉得不是很符合主题,因为编程思想的范围太大了,不仅仅是封装 继承 多态,所以比较符合主题的应该是面向对象思想。这一篇中将继续叙述面向对象思想中的继承。

    从字面来看继承表达的意思已经很清楚了,我们看电视剧就经常有一个富二代老头去世或者退位,就由儿女继承他的家产,一个黑帮老大倒下,由他最得力的小弟继位,这些都是继承,现实世界中的继承是过继,是将老爸(父类)的财产或权利过继给儿女,过继完后老爸(父类)将不再拥有这些东西,而程序中的继承并不是将父类的东西过继给子类,更多的像是一中基因的遗传,老爸(父类)有的属性和行为,你都可以完全的拥有,并且老爸(父类)中的这些行为和属性仍然还在,并不会因为继承而消失,如下图:


    在程序中的继承和现实世界中的继承是不一样的,子类继承于父类后,父类仍然拥有这些属性和行为。

    继承的基本概念:
     C#中只支持单继承,但运行实现多个接口,支持多接口继承(接口将会在下一章说明)。
     当子类继承与父类则自动拥有父类中所有的成员(私有除外)。
     密封类、结构类不可继承。

    下面来看一段简单的代码:
    首先创建一个动物父类

     1 public class Animal
     2 {
     3 //名称
     4 private string Name;
     5 
     6 //呼吸方法
     7 public void breathing()
     8 {
     9 Console.WriteLine(Name + "在呼吸...");
    10 }
    11 
    12 //进食
    13 public void eating()
    14 {
    15 Console.WriteLine(Name + "在进食...");
    16 }
    17 
    18 //使用构造函数初始化名称
    19 public Animal(string Name)
    20 {
    21 this.Name = Name;
    22 }
    23 }
    24 
    25 再创建一个人类(子类),继承使用 类名 :父类名 的格式
    26 //人类是动物的一种
    27 public class Person : Animal
    28 {
    29 //使用构造函数初始化父类动物的名称
    30 public Person(string Name) : base(Name)
    31 { }
    32 }
    33 
    34 通过子类调用父类的方法:
    35 class Program
    36 {
    37 static void Main(string[] args)
    38 {
    39 //实例化一个Person类,并且在构造函数中传入一个参数
    40 Person person = new Person("人类");
    41 //调用父类呼吸方法
    42 person.breathing();
    43 //调用子类进食方法
    44 person.eating();
    45 Console.ReadKey();
    46 }
    47 }

    通过这里可以看到子类并没有创建 breathing 和 eating方法,但是可以在实例中直接的调用,这就是自动的拥有的父类的行为。

    到这里再思考一下,如果父类中的方法我们并不满意想要用自己的方法去代替父类,那么在父类中的方法就要声明虚方法(virtual),可以在子类中重写(override)父类的函数

    虚方法(virtual)的使用:
    比如在Animal类中想要派生一个子蛇类Snake,蛇在冬天的时候会冬眠一段时间所以不需要进食,那么只需要在Animal类中添加一个virtual关键字,代表是虚方法,可以直接拿来用也可以根据子类的需要重写它:

    public class Animal
    {
      //名称
      private string Name;
    
      //呼吸方法
      public void breathing()
      {
        Console.WriteLine(Name + "在呼吸...");
      }
    
      //进食添加一个虚函数子类可以重写它
      public virtual void eating()
      {
        Console.WriteLine(Name + "在进食...");
      }
    
      //使用构造函数初始化名称
      public Animal(string Name)
      {
        this.Name = Name;
      }
    }
      //子类中使用重写(override)
    public class Snake : Animal
    {
      public Snake(string name) : base(name)
      { }
      //重写父类方法
      public override void eating()
      {
        Console.WriteLine("现在是冬天不需要进食!");
      }
    } 当然我们也可以直接覆盖掉父类的方法,这里注意重写和覆盖的作用是不同的。
    public class Snake : Animal {   public Snake(string name) : base(name)   {

      }   
    //直接在函数前面使用new覆盖父类方法   new public void eating()   {     Console.WriteLine("现在是冬天不需要进食!");   } }

    小结一下,这篇文章中我们介绍了继承的基本概念,还有使用了简单的代码来演示继承在程序中的表达方式,其实要深入的话还有很多的作用,但是篇幅有限,这里我指介绍最基本的用法,如果有遇到问题的朋友也可以直接发微信给我。

  • 相关阅读:
    python读写操作excel数据
    python读写操作excel数据小应用
    操作系统相关知识
    网络编程课堂笔记
    UDP简单初识+socketserver 模块实现服务端并发
    链接循环+模拟远程执行命令+实现大文件上传
    循环通信
    luogu P2761 软件补丁问题
    luogu P4016 负载平衡问题
    P3381 【模板】最小费用最大流(spfa板子)
  • 原文地址:https://www.cnblogs.com/leonliuyifan/p/7044382.html
Copyright © 2011-2022 走看看