析构函数、多态

来源:互联网 发布:c 生命数组 编辑:程序博客网 时间:2024/05/21 04:00

接昨天所学知识

一、 方法隐藏


         如果子类方法的方法名和基类的方法名相同时,系统将隐藏基类同名方法,自动调用子类的同名方法


二、 Virtualoverride


        virtual 用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写。

        例如:public virtual void eat();


        override 用在派生类中,表示对基类虚方法(属性)的重写。

例如:public override void eat();

 

代码举例:

  1. using System;

  2. using System.Collections;



  3. public class Animal

  4. {

  5.     public Animal() { }

  6.     public virtual void eat()

  7.     {



  8.     }

  9. }



  10. public class dog:Animal

  11. {

  12.     public override void eat()

  13.     {

  14.         //如果父类的虚方法中有我们需要的数据,可以在子类的覆盖方法中调用它:

  15.         //base.eat();

  16.         Console.WriteLine("狗吃骨头");

  17.     }

  18. }



  19. public class cat:Animal

  20. {

  21.     public override void eat()

  22.     {

  23.         Console.WriteLine("猫吃鱼");

  24.     }

  25. }



  26. public class panda:Animal

  27. {

  28.     public override void eat()

  29.     {

  30.         Console.WriteLine("熊猫吃竹子");

  31.     }

  32. }



  33. public class MainFun

  34. {

  35.     static void Main()

  36.     {

  37.         Animal[] anim = new Animal[3];

  38.         anim[0] = new dog();

  39.         anim[1] = new cat();

  40.         anim[2] = new panda();

  41.         anim[0].eat();

  42.         anim[1].eat();

  43.         anim[2].eat();

  44.     }

  45. }

运行结果:

 

 

总结:


1.virtual关键字和override关键字是成对出现的,否则是语法错误。


2.派生类可以通过将重写声明为 sealed 来停止虚拟继承。这需要在类成员声明中的 override 关键字前面放置 sealed 关键字。


3.在子类中重写基类中的虚方法时,可以使用base关键字调用基类中的虚方法。

 

三、 多态

 

通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性C#中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。

 

多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。

 

例如,表示汽车的基类可能包含这样的行为:

 

当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变。基类可以将这些类成员标记为虚拟的,从而允许表示敞篷汽车和小型货车的派生类重写该行为。

 

多态是父类使用子类的方法

 

四、 私有构造函数

 

用关键字private修饰的构造函数就是私有构造函数。

 

五、 析构函数

 

       析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

 

析构函数的声明:

  1. class Car

  2. {

  3.     ~Car()  // destructor

  4.     {

  5.         // cleanup statements...

  6.     }

  7. }

 

 

 

该析构函数隐式地对对象的基类调用 Finalize 这样,前面的析构函数代码被隐式地转换为以下代码:

 

  1. protected override void Finalize()

  2. {

  3.     try

  4.     {

  5.         // Cleanup statements...

  6.     }

  7.     finally

  8.     {

  9.         base.Finalize();

  10.     }

  11. }

 

这意味着对继承链中的所有实例递归地调用 Finalize 方法(从派生程度最大的到派生程度最小的)。

 

 

析构函数和构造函数的区别:


构造函数和析构函数是在类体中说明的两种特殊的成员函数。

 

构造函数的功能是在创建对象时,使用给定的值来将对象初始化。

 

析构函数的功能是用来释放一个对象的。在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。

 

 

           由于索引器是重点所以我决定再单写一篇

       欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。

 

 

0 0
原创粉丝点击