unity 3D OOP学习笔记之三 (隐藏 重写)

啥是多态?
多态:多种形态,对象的多种形态,行为的多种形态
1 体现为,子类对象可以通过父类型引用
Animal obj3 = new Dog(); 1语法 2概念 obj3
2 行为的多态体现为方法的重写,隐藏,重载
继承将相关概念的共性进行抽象,并提供了一种复用的方式。
多态在共性的基础上,体现类型及行为的个性化。
一个行为有多个不同的实现
多态的实现方式,有几种实现多态的方式
1实现多态的基本方式:隐藏,重写
2实现多态其它方式:重载,接口,

隐藏 =方法隐藏
解决父类的方法在子类不适合的问题。
但是父类的方法不能重写(不是virtual,abstract,override),
此时可能选择方法隐藏,
子类新定义一个方法,与父类方法同签名,(同方法名字 同 参数)
子类型用新定义的方法隐藏掉父类继承的旧方法。
方法隐藏时语法建议在方法前加new关键字

What:隐藏【方法隐藏,方法隐藏技术,隐藏技术】
隐藏是多态的一种实现方式。
【使用步骤:】
在父类中定义普通的方法
在子类中定义隐藏方法

(用new修饰的和父类中的方法名相同参数相同的方法,
new可以省略,最好不省略)

注意:辨析方法隐藏,隐藏方法
方法隐藏指的是技术,分两步 1》父2》子
隐藏方法:特殊的方法 new修饰的方法

缺陷:??? 调子 只能是 子 obj=new 子();
父 obj=new 子();调用隐藏方法是父类的方法

class Program
    {
        static void Main(string[] args)
        {
            Animal Obj = new Dog();
            Obj.Run();
            Console.ReadLine();
        }
    }
    class Animal
    {
        public void Run()
        {
            Console.WriteLine("Animal RUN");
        }
    }

    class Dog:Animal
    {
        public void Run()
        {
            Console.WriteLine("Dog Run ");
        }
    }

在这里插入图片描述
好处:调用端代码可以更加简洁
声明一个变量即可!
隐藏无法实现父调子,重写可以!!
更好的复用性!!!

重写

虚方法
什么是虚方法:
定义【语法】:用vritual关键修饰的已经实现的方法,即是虚方法
语义【含义】:虚方法表示一个可以在子类中重写的方法
【重写不重写都可以】

方法重写

重写有三种重写的方法
1》 虚方法重写
2》 重写方法重写
3》 抽象方法重写

为什么需要重写:为了选择性复用(解决父类所
定义方法在子类中不适用)

1 虚方法重写
【步骤1:】在父类中定义虚方法
【步骤2:】在子类中定义重写方法
重写方法:和父类中的
方法名相同参数相同方法返回类型相同,要加override

注意对应关系!!
特点:调父的实现 1种写法;调子的实现 2种写法
父调子意义重大!

class Program
    {
        static void Main(string[] args)
        {
            Animal Obj = new Dog();
            Obj.Run();
            Console.ReadLine();
        }
    }
    class Animal
    {
       virtual public void Run()
        {
            Console.WriteLine("Animal RUN");
        }
    }

    class Dog:Animal
    {
       override public void Run()
        {
            Console.WriteLine("Dog Run ");
        }
    }

在这里插入图片描述

2重写方法重写
override方法,已经重写过的方法,在子类还可以继续重写,
除非被标识为sealed

sealed(密封)的作用 1放在类前 封闭类 2重写方法前 封闭方法
1. 用在类的定义上,指示当前类不能做父类,也就是任何类都不可继承当前类
2. 用在重写的成员,指示当前类的子类,不能再次重写该成员
sealed 用在方法前边,必须和override 在一起
sealed override 修饰的方法 叫封闭方法,只有重写方法才可以封闭

封闭类定义:sealed修饰的类
特点:不能被继承。不能有子类。可以实例化!

隐藏和重写的比较
共性:都是多态实现的基本方式,都可以实现选择性的复用
【解决父类方法不适合子类的问题】
不同:
1)隐藏不能实现父调子 父 obj=new 子()
重写可以实现父调子 从而让代码具有更好的复用性,
可维护性。
实际开发中重写用的多
2)实现原理不同
隐藏 静态绑定 性能略高 灵活性差
重写 动态绑定 性能略低 灵活性好
如果实现同样的功能,不需要父调子,仅仅为了
选择性复用,使用隐藏 性能略高!

动态绑定(晚期绑定)与静态绑定(早期绑定)
绑定:类型与关联的方法的调用关系,
通俗讲就是一个类型能够调用哪些方法 B:A A:?
【系统确定一个类型能调用哪些方法的过程,绑定】
1静态绑定(编译时绑定):是指调用关系是在运行之前确定的,即编译期间
2 动态绑定(运行时绑定):是指调用关系是在运行期间【过程中】确定的。
静态绑定因为在编译期确定,不占用运行时间,
所以调用速度比动态绑定要快
动态绑定因为在运行期确定,占用运行时间,但是更灵活。
动态绑定比静态绑定灵活性好. 速度略低
方法隐藏是静态绑定
方法重写是动态绑定

方法隐藏原理
方法隐藏是子类的方法表加入一个新项,新项中表示的方法签名与继承来的方法签名一致,但是在方法表中不能出现相同签名的方法项,所以必须要隐藏掉一个。子类用新项隐藏旧项。方法隐藏是在方法表加新项
在这里插入图片描述
方法重写原理
父类的方法在子类重写后,是子类型将方法表中相应方法签名对应的方法所在的地址重写了,重写后,原方法签名项关联到新方法的地址。当引用调用该方法时,访问新地址中的方法。
所以方法重写后,不管是通过父类还是子类型的引用,调用方法时,都调用对象真实类型中定义的方法
在这里插入图片描述