扣响C#之门笔记-第九章

9.1 继承的概念

继承:

基类(父类)

派生类(子类)

派生类中自动拥有了父类的定义的变量和函数,每个派生类也可以成为其他新派生类的父类;

9.2 由父类派生子类

1.继承的语法:

eg

 class Animal               //(1)定义父类
    {
        public double weight;
        private double temperature;
        public Animal()
        {
            weight = 0;
            temperature = 0;
        }
        public void eat()
        {
            Console.WriteLine("eat");
        }
        public void breathe()
        {
            Console.WriteLine("breathe");
        }
        public void sleep()
        {
            Console.WriteLine("sleep");
        }
    }

    class Mammal:Animal       //(2)定义子类:继承于父类
    {
        private string skins;
        public Mammal()
        {
            skins = "皮";
        }

        public string Skins
        {
            set { skins = value; }
            get { return skins; }
       }
        public void run()
        {
            Console.WriteLine("run");
        }
        public void scukle()
        {
            Console.WriteLine("scukle");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Mammal best = new Mammal();
            Console.WriteLine(best.weight); // (3)使用继承于父类中的属性
            Console.WriteLine(best.Skins); //       使用新添加的属性

            best.eat(); //使用继承于父类中方法
            best.run();//使用子类添加的方法
            Console.ReadKey();

        }
    }

9.3 protected 成员

父类中的private修饰成员,只能在类自己内部使用,不能再子类中使用;解决这个问题有两种方法:

(1)此时使用protected 修饰,protected 成员不能被类外部使用,但是在子类总使用(如果将成员修饰符换成public,但是这样会让类失去封装性);

(2)定义一个public的属性实现;

private成员:只有本类内能使用(本类的对象都不能使用)

    class Animal
    {
        private double weight;
    }
    class dog:Animal
    {
        void print()
        {
            weight=30; //error,无法访问
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Animal a = new Animal();
            a.weight = 30;  //error,无法访问
        }
        }
    }

protected 成员:只有本类(废话)和子类中能使用

    class Animal
    {
        protected double weight;
    }
    class dog:Animal
    {
        void print()
        {
            weight=30; //protected 成员,子类可以访问
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Animal a = new Animal();
            a.weight = 30;  //protected 成员,外部无法访问
        }
        }
    }

9.4 虚函数与重写

(1)虚函数就是用vortual修饰的函数,一般在基类上设计虚函数,在派生类中重写(Override);

    class Animal
    {
        private double temperature;   //(1)虚函数
        public virtual void eat()
        {
            Console.WriteLine("eat");
        }
    }
    class dog : Animal
    {
        private double temperature;
        public override void eat()   //重写虚函数
        {
            Console.WriteLine("dog eat");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            dog g = new dog();
            g.eat();
            Console.ReadKey();

        }
    }

(2)重新(override)与重载:

重载:是指在同一个类中,有多个函数名相同,但是参数类型/个数不同的多个函数;重载发生在同一个类中;(系统根据调用的 实参数个数和类型自动匹配对应重载的函数)

重写:是指子类中定义了和父类同名的函数,并改写这个方法;重写发生在继承关系中;(系统根据对象的实际类型调用对应函数,如果对象是父类对象,就调用父类中方法,如果是是子类对象,则调用子类对象)

9.5 函数的隐藏

派生类可以使用new 关键修饰函数,从而隐藏基类中的同名函数;

    class Animal
    {

        public  void eat()
        {
            Console.WriteLine("eat");
        }
    }
    class dog : Animal
    {

        public new void eat()  //new 关键字
        {
            Console.WriteLine("dog eat");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            dog g = new dog();
            g.eat();
            Animal a = new Animal();
            a.eat();
            Console.ReadKey();
        }
    }

6.6 Base关键字

利用关键字base,可以在子类中(只能在子类中)调用父类的重写的后者隐藏方法;

 

    class Animal
    {

        public  void eat()
        {
            Console.WriteLine("eat");
        }
    }
    class dog : Animal
    {

        public new void eat()
        {
            base.eat();  //base关键字
        }
    }

6.7抽象类和抽象函数

(1)抽象类:就是用就是用Abstrct修饰的类

(a)抽象类不能实例化;

(b)抽象类和抽象函数,抽象属性没有什么必然关系,抽象类内部可以是抽象方法,也可以是一般法方法,或者都有都可以(但是有抽象方法的类一定是抽象类);

(c)如果一个非抽象类继承抽闲类,这个子类,必须要实现(用重新)抽象父类中所有抽象方法,否则,这个类就必须还是抽闲函数;

    public  abstract class Animal
    {
          private void eat()
          {
              Console.WriteLine("");
          }
          public abstract void run();
          public abstract void sleep();
    }

    public class dog : Animal    //错误,子类没有重写完父类所有抽象方法,这个类必须还是抽象函数
      {
        public  override void run(){}
        //

      }

(2)抽象函数:就是用就是用Abstrct修饰的函数()

(a)抽闲函数是一种特殊的虚函数,必须在抽闲类中定义;有抽象方法的类一定是抽象类;

(b)抽闲函数定义时候只能有函数签名,不能有任何执方法体(包含{}都不能有);

 public  abstract class Animal
    {
          private void eat()
          {
              Console.WriteLine("");
          }
          public abstract void run(){};  //错误,抽象方法不能有任何方法体
          public abstract void sleep();
    }

(C)抽象方法,抽象属性必须为public,否则编译出错;

      abstract class Animal
    {
          private void eat()
          {
              Console.WriteLine("eat");
          }
           abstract void run();   //错误抽象成员不能为私有的,只能为public
          public abstract void sleep();
    }

(3)抽闲属性:

(a)也可以定义抽象属性:抽象属性也不能有任何实现代码({}都不能有)

   abstract class Animal
        {
            abstract public int Age
            {
                set; //不能有属性也不能有具体实现,({}都不能有)
                get;
            }

        }

(b)同样的,抽闲属性,也必须在继承类全部中用overridi,重写,否则这个类也必须为抽象类;

        abstract class Animal
        {
            string name;
            abstract public int Age  //抽象属性
            {
                set;
                get;
            }
        }
        class dog : Animal
        {
            public override int Age  //重写属性
            {
                set { }
                get { return 3; }
            }
        }

(4)小结:

(1)含有抽象方法或者抽象属性(字段不能为抽象的)的类必须是抽象类;

(2)抽象成员必须为public的;抽象成员不能有任何的实现体(包含{})

(3)如果一个实体继承抽象类,那么子类必须实现所有的抽象方法和属性,否则这个类必须还是抽象累;

(4)抽象类不能直接实例化,抽象方法/属性不能直接使用,必须在子类中用overridie重写;


 

时间: 2024-08-28 08:22:06

扣响C#之门笔记-第九章的相关文章

扣响C#之门笔记--第二十三章

23.1 泛型的概念 (1)在普通集合中,元素均被看做是object类型,会有以下缺点(a)赋值时候将类型转为object,使用时候又将object转为对应的类型,在装箱和拆箱时候造成一定性能损失:(b)任何类型的数据都可以放进集合里面,不利于类型安全检查: static void Main(string[] args) { Queue q = new Queue(); q.Enqueue(10); q.Enqueue("wo"); // q.Enqueue(1); foreach (

扣响C#之门笔记-第十九章

19.1 sting 类 sting 类的基础用法: (1).NET为sting设计了索引器,因此可以像数组那样访问字符串: (2)Length属性表示字符串长度(是string类唯一的属性) (3)"="运算符将元字符串的引用,传递给目标字符串,从而使两个变量指向同一个字符串: (4)字符串不可改变,当我们改变字符串的值时,系统会为字符串重新分配引用空间,并将值放进去:(因此不会影响原引用地址的内容) (5)string.Copy用于复制字符串内容,(直接复制值,非引用地址) (6)

扣响C#之门笔记-第八章

8.1 以对象为成员 1.类的成员不光是可以使int,double等基本类型,也可以是其他类的对象: class Program { static void Main(string[] args) { date d = new date(1992, 5, 18, new Time(12, 20, 5)); } } class date { int year; int month; int day; Time t; //(1)含有其他对象成员的类 public date(int year, int

扣响C#之门笔记-第十章

10.1派生类的对象和基类的关系 (1)is A 关系(属于关系): 对象是属于类的,因此对象和类是属于关系:子类是属于父类的,因此子类和父类是属于关系: 因为:对象属于类,所以子类对象属于子类: 又因为:子类属于父类,所以子类对象属于父类 10.2 多态的概念 (1)引用符与对象 对象:对象是实存放对象实体的,是存储在堆中: 引用符:引用符中存放的是对象在堆中的地址,是存放在栈中: 有前面理论:子类对象属于父类,所以父类引用符可以指向子类对象: 也即是说: (a)子类实例(引用,对象)可以赋值

Android群英传笔记——第九章:Android系统信息和安全机制

Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战,本节就要是讲 Android系统信息的获取 PackageManager的使用 ActivityManager的使用 Android安全机制 一. Android系统信息的获取 由于android手机的开源性,手机的配置各种各样,那些优化大师之类的东西

《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

《从0到1》笔记 第九章 基础决定命运

第九章 基础决定命运----每个成功企业都是独一无二的,而要做好每个事业,有些事情在起步阶段就必须做好:----基础没有打好的初创企业是无法挽救的. 开头很特殊,它在本质上有别于之后的阶段.如美国的<独立宣言>的制定,后来的几百年都只是小修改. 公司初创时,对合伙人的选择,制度的制定,产品的方向都是基础性的,决定企业最终命运的.现在我考虑投资一家初创公司时,会考察其创立团队.技术能力和才华互补固然重要,但创始人之间的了解程度和他们合作的默契程序也同样重要.创始人在共同创业前应有深厚的交情,否则

读书笔记第九章

第九章HAL是建立在linux驱动之上的一套程序库.这套程序库并不属于linux内核,而是属于linux内核层之上的应用层.可以用来保护不想公开源代码的作者.HAL架构比较简单,其基本原理就是在安卓系统中使用程序库调用位于内核空间的linux驱动,然后安卓应用程序可以通过NDK程序访问HAL中的程序库,或直接在安卓应用程序中访问HAL中的程序库.编写一款支持HAL的linux驱动程序的步骤:1.编写linux驱动,linux驱动的代码要尽量简介,尽可能将业务逻辑放到HAL library中.2.

Java学习笔记—第九章 字符串String

第九章 字符串String Java中使用String类来创建一个字符串变量,字符串变量是类类型变量,是一个对象.声明字符串的语法格式如下:String s; 创建字符串:通过String类提供的构造方法可创建字符串,有以下几种方式: (1)创建字符串对象时直接赋值,例如: String s1 = "hello"; String s2 = new String("hello"); (2)由一个字符串创建另一个字符串,例如: String s1 = "hel