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

10.1派生类的对象和基类的关系

(1)is A 关系(属于关系):

对象是属于类的,因此对象和类是属于关系;子类是属于父类的,因此子类和父类是属于关系;

因为:对象属于类,所以子类对象属于子类;

又因为:子类属于父类,所以子类对象属于父类

10.2 多态的概念

(1)引用符与对象

对象:对象是实存放对象实体的,是存储在堆中;

引用符:引用符中存放的是对象在堆中的地址,是存放在栈中;

有前面理论:子类对象属于父类,所以父类引用符可以指向子类对象;

也即是说:

(a)子类实例(引用,对象)可以赋值给父类引用符(自动化转型)
(b)但是此父类引用符无法调用子类特有的成员,只能调用子类从父类继 承来的成员;

10.3 多态性的运用

1.多态使用

(1)父类定义一个抽象函数,多个子类分别重写这个抽象函数;

(2)设计通用部分(使用父类类型来定义一个形参
(3)产生多个子类,将对象传递给通用部分,调用同样方法,得到不同的结果

    abstract class vertebrata      //(1)父类定义一个抽象函数,多个子类分别重写这个抽象函数;
    {
        abstract public void Show();
    }
    class mammal : vertebrata
    {
      public  override void Show() { }
    }
    class dog : mammal   //(2)多个子类分别重写这个抽象函数;
    {
        public override void Show()
        {
            Console.WriteLine("dog");
        }
    }
    class peg : mammal
    {
        public override void Show()
        {
            Console.WriteLine("peg");
        }
    }
    class brid : mammal
    {
        public override void Show()
        {
            Console.WriteLine("brid");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            vertebrata[] animals = { new dog(), new peg(), new brid() };
            foreach (vertebrata v in animals)   //设计通用部分(使用父类类型来定义一个形参.产生多个子类,将子类对象传递给通用部分;
            {
                v.Show();
            }
            Console.ReadKey();
        }
    }

2.除了使用bastract方法和override可以实现多态,也可以用virtual 与overrride实现

但是注意:

(1)由于虚函数(不是抽象函数)必须有方法体,因此设计成空实现或者随便实现;

(2)必须是用overtide重写虚函数(可以不加overtide重写虚函数的哦,但是结果不一样)的中方法,否则父类引用符好像会隐藏子类中同名方法,得不到子类同意同一方法不同的实现;

由于必须要使用override 重写父类中同名方法才能实现多态,因此父类中的同名方法必须修饰为virtual或者basetract;(不修饰为virtual或者basetract就不能使override重写,否则语法错误);

 class vertebrata
    {
         public virtual void Show() { Console.WriteLine("vertebrata"); }
    }
    class mammal : vertebrata
    {
        public override void Show() {}
    }
    class dog : mammal
    {
        public override void Show()
        {
            Console.WriteLine("dog");
        }
    }
    class peg : mammal
    {
        public override void Show()
        {
            Console.WriteLine("peg");
        }
    }
    class brid : mammal
    {
        public override void Show()
        {
            Console.WriteLine("brid");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            vertebrata[] animals = { new dog(), new peg(), new brid() };
            foreach (vertebrata v in animals)
            {
                v.Show();
            }

           // ((dog)animals[0]).Show();
            //((peg)animals[1]).Show();
            Console.ReadKey();
        }
    }

3.将子类实例赋值给基类引用符(自动发生向上转型),父类引用符无法使用子类特有成员;(后者说子类特有成员对父类不可见);

(如果不用override重写,父类引用就会隐藏子类同名方法改写;也即是子类覆盖的父类方法,父类不可见(说白了这个覆盖的方法也算是子类特有的,由于子类特有成员对父类都是不可见的)

    class vertebrata
    {
        public  void Show() { Console.WriteLine("vertebrata"); }
    }
    class mammal : vertebrata
    {
        public void Show() {  }
    }
    class dog : mammal
    {
        public  void Show()
        {
            Console.WriteLine("dog");
        }
    }
    class peg : mammal
    {
        public  void Show()
        {
            Console.WriteLine("peg");
        }
    }
    class brid : mammal
    {
        public  void Show()
        {
            Console.WriteLine("brid");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            vertebrata[] animals = { new dog(), new peg(), new brid() };
            foreach (vertebrata v in animals)
            {
                v.Show();          //如果不用override重写,父类引用就会隐藏子类同名方法改写;也即是子类覆盖的父类方法,
                                  //父类不可见(说白了这个覆盖的方法也算是子类特有的,由于子类特有成员对父类都是不可见的)
            }
            // ((dog)animals[0]).Show();
            //((peg)animals[1]).Show();
            Console.ReadKey();
        }
    }

10.4 Is运算符

1.is运算符用与判断每个实例是否属于某个类,如果这个实例属于这个类,或者这个类的父类,则返回true,否则返回false;

2.使用方法:     对象 is  类名

 class Program
    {
        static void Main(string[] args)
        {
            int i = new int();
            i = 5;
            Console.WriteLine(i is int);
            Console.WriteLine(i is object);
            Console.WriteLine(i is Double);

            Console.WriteLine(new int() is Double);

            Console.ReadKey();
        }
    }

10.5 对象转型

(1)由低层次转为高层次称之为向上转型,向上转型是自动进行的,

派生类转为基类是是向上转型,是自动进行的,但是基类不能引用符不能使用子类对象特有的成员;

    class A
    {
    }
    class B : A
    {
        void show()
        { Console.WriteLine("show"); }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A aa = new B();
            aa.show();//error,父类引用符,无法使用子类特有成员
        }
    }

(2)由高层次转为低层次称之为向上转型,必须要强制转换;

注意:只有引用本身原来就是子类型才能转为子类,如果引用本身原来是父类型或者其他类型,则无法转换

    class A
    {
    }
    class B : A
    {
       public void show()
        { Console.WriteLine("show"); }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A aa = new B();
            ((B)aa).show(); //强制向下转换:由于aa本来就是子类的实例,所以才能转为子类;

            A aaa = new A(); //error 由于aa本来就是父类型/或者其他类型,所以就无法转换
            ((B)aaa).show();
        }
    }

10.6 接口

待续。。。。

10.7 类关系视图

时间: 2024-10-12 04:54:15

扣响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#之门笔记-第九章

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.Wri

扣响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

《Python基础教程(第二版)》学习笔记 -> 第十章 充电时刻 之 标准库

SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg])                退出当前的程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 平台标识符 stdin 标准输入流-- 一个类文件对象 stdout 标准输出流-- 一个类文件对象 stderr

扣响C#开发之门---第十二章

12.1 异常概述 异常:异常就是程序执行期间发生的问题.异常发生的原因不一定都在程序上,比如用户输入非法数据,读取不存在的文件等等: 如: class Program { static void Main(string[] args) { Console.WriteLine("输入分母"); int de = Convert.ToUInt16(Console.ReadLine());//如果Console.ReadLine()无法转为数字,产生异常 double result = 1

扣响AI服务细分化之门:腾讯超级大脑的三项差异能力

我们为什么要研究AI?为什么科技企业乃至各国政府都纷纷大规模地投入资金来支持AI研究?并不仅仅是因为它很好玩儿,以及身上所附带的天然的类人感觉.最重要的是,它将给我们的生活.生产方式带来巨大的变化. AI复兴的十几年里,尤其是最近几年,它已经逐步走出了实验室和论文,开始渗入了人们的生活当中.而随着研发技术的成熟,从2017年开始,AI已经开始了技术下沉应用的进程.进入到2018年,AI在工业.企业.政府.零售.医疗等各行各业开始了自己的表演.可以说,2018年将是AI深刻改变行业模式的一年. 各

《从0到1》笔记 第十章 打造帮派文化

第十章 打造帮派文化----我的团队管理风格 从一开始,我就想让PayPal员工紧密团结,而不是出于事务关系待在一起. 除了工作时间,其它时间也要更多地交流和活动. 初创公司早期要让员工尽可能地个性相像,因为观点一致,更容易高效运转.每名员工只专注于一件事情:因为角色界定明确可以减少矛盾,消除竞争更易于建立长久的纯粹的工作关系以外的交情.内部和谐也是初创公司存活的关键. 一.如何才能打造一支优秀的团队 一位早期创业公司创始人在问答网站 Quora 上面的一个 提问最近很火,大家给出的答案超过了

读书笔记第十章

第十章 打印内核的调试信息printk: printk与printf区别: printk 函数该函数的用法与printf函数类似,具不过printk函数运行内核空间,printk函数运行在用户空间.也就是说,像Linux驱动这样的Linux内核程序只能使用prink函数输出调试信息. 其次应该防止printk函数可以很方便地将消息写入日志文件或控制台,但是大量使用printk函数频繁操作日志文件或控制台设备文件会严重影响Linux驱动的性能,因此这就要求Linux驱动只在开发阶段使用printk