热门教程推荐
  • 【一】算法是什么
    【一】算法是什么
    提到“算法”,很多人都觉得它高深莫测、晦涩难懂。事实上的确存在一些算法,学员必须具备优秀的数学基础和编程能力才能驾驭。
  • 【二十一】创建之单例设计模式
    【二十一】创建之单例设计模式
    单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  • 【九】部分背包问题
    【九】部分背包问题
    背包问题是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
  • 【二】Unity3D视图界面
    【二】Unity3D视图界面
    Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面
  • 【九】Unity3D游戏发布
    【九】Unity3D游戏发布
    Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布
  • 【十】表查找解
    【十】表查找解
    查找表又可分为静态查找表和动态查找表。借助静态查找表可引申出顺序查找算法、折半查找算法、分块查找算法等;而记住动态查找表,也可以通过构建二叉排序树、平衡二叉树等实现查找操作。
  • 【二】游戏世界之渲染窗口
    【二】游戏世界之渲染窗口
    游戏世界之渲染窗口
  • 【九】动态内存管理
    【九】动态内存管理
    动态内存管理机制,主要包含两方面内容,用户申请内存空间时,系统如何分配;用户使用内存空间完成后,系统如何及时回收。

【C#语言】C#面向对象(多态)

3238

在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中有不同的事项方法,从而为解决同一问题提供多种途径。

 

多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。

多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。


静态多态性

在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:

1、函数重载

2、运算符重载


动态多态性

C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。

请注意,下面是有关抽象类的一些规则:

您不能创建一个抽象类的实例。

您不能在一个抽象类外部声明一个抽象方法。

通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

多态的出现提高了代码复用性,扩展性,使后期维护更加方便。

 

多态的弊端:前期定义的内容不能使用(调用)后期子类中的特有内容

 

使用多态的前提:

1.想让一个事物具备另一种形态,一定有继承关系(实现)

2.要有覆盖。操作父类型。

 

多态中的成员:

Fu f=new Zi();

f.show;

 

变量:

父类形指向子类对象,调用的是父类的变量

编译时:参考变量的类型中是否有调用的成员变量,如果有就通过编译,没有就报错

运行时:参考变量的类型中是否有调用成员变量,如果没有就运行该类中的变量

简单说:编译和运行都看等号左边。

 

方法:

编译时:参考靠变量类型中是否有调用成员变量,如果有就通过编译,没有就报错

运行时:参考对象中是否有调用的函数,如果有就调用,如有没有也会调用(父类)

简单说:编译看左边,运行看右边。

 

C#中可以通过多种途径实现多态性:

A. 虚方法:将父类方法标记为虚方法,(使用关键字virtual),此方法在子类中可以重写(使用关键字 override)

B.抽象类与抽象方法:如果我们不需要使用父类创建对象,他的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类方法写成抽象方法,子类中的方法仍用关键字override 重写。

C. 接口实现:

 

我们选择使用虚方法实现多态还是抽象写抽象方法实现多态,取决于我们是否使用基类实例化的对象

抽象类:不需要使用基类实例化的对象(利用抽象来实现,类抽象化,方法抽象化,并且方法中不能有方法体{})

虚方法:需要使用基类实例化的对象

 

namespace 多态

{

    //定义抽象类

    abstract class Vertebrata

    {

        //定义抽象函数:绘图

        public abstract void DrawSelf();

    }

 

    class Zhu : Vertebrata

    {

        public override void DrawSelf()

        {

            Console.WriteLine(@"

                 ╭︿︿︿╮

                {/ o  o /}  

                 ( (oo) )  

                  ︶︶︶");

        }

    }

 

    class QingWa : Vertebrata

    {

        public override void DrawSelf()

        {

            Console.WriteLine(@"

                  @..@

                 (\--/)

                (.>__<.)

                ^^^^^^^^");

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            //声明一个基类Vertebrata类型的数组

            Vertebrata[] animals = new Vertebrata[2];

 

            //定义派生类,并存储到数组

            animals[0] = new Zhu();

            animals[1] = new QingWa();

 

            //使用统一的方法进行调用

            foreach (Vertebrata someone in animals)

            {

                //无论是什么动物,都使用相同的语句处理

                someone.DrawSelf();

            }

        }

    }

}


is运算符

is运算符通常用于判断某个对象是不是某种类型。

//假设Human继承自Vertebrata

Human jean=new Human();

Vertebrata someone=jean;

if(someone is Human)

{

  Console.WriteLine("someone is Human");

}

if(someone is Vertebrata)

{

  Console.WriteLine("someone is Vertebrata");

}

 

向上转型

由低层次类型转换为高层次类型,称为向上类型转换。向上类型转换是自动进行的,比如把int类型变量赋值给long类型变量,把long类型赋值给double型变量,转换都是自动进行的。

由派生类转换为基类,也是向上转换,但基类的引用符不能引用派对生类对象特有的函数。

//假设基类Vertebrata中无work方法,在Human类中定义了work方法

   Human jean =new Human();

   Vertebrata someone =jean;

   //这个地方是错误的.

   someone.Work();

   

向下转型

由基类向派生类转换的过程称为向下转换,在这个过程中,需要进行强制转换,同时也可以使用关键字as.

Human jean=new Human();

Vertebrata someone=jean;

 

if(someone is Human){

  Human people =(Human)someone; //强制转换

  people.Work();

}


注意:

*只有由基类向派生类转换时,才能强制向下转换,否则程序会抛出异常,所以转换之前 我们使用is运算符进行检查。

Human jean=new Human();

Vertebrata someone=jean;

Human people =someone as Human; //as 运算符

if(people!=null)

{

  people.Work();

}

一个常见的错误:Program has more than one entry point defined. Compile with/main to specify the type that contains the entrypoint.

项目有多个入口点的定义。编译/主要指定类型,其中包含的入口点。


特别声明:本文仅供交流学习 , 版权归属原作者,并不代表游民部落赞同其观点和对其真实性负责。若文章无意侵犯到您的知识产权,损害了您的利益,烦请与我们联系vmaya_gz@126.com,我们将在24小时内进行修改或删除。

相关推荐:

精品教程推荐
  • 【四】3D美术资源规范
    【四】3D美术资源规范
    美术3D资源规范美术3D资源规范美术3D资源规范美术3D资源规范美术3D资源规范
  • 【三十】游戏UI之列表和无线列表
    【三十】游戏UI之列表和无线列表
    游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表
  • 【二十】排序之快速排序算法
    【二十】排序之快速排序算法
    提到排序算法,多数人最先想到的就是快速排序算法。快速排序算法是在分治算法基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。
  • 【二】项目工程结构规划
    【二】项目工程结构规划
    项目工程结构规划项目工程结构规划项目工程结构规划项目工程结构规划
  • 【六】数组和广义表
    【六】数组和广义表
    数组存储结构,99%的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。
  • 【七】Unity3D模型与动画
    【七】Unity3D模型与动画
    Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画Unity3D模型与动画
  • 【四十三】图之图的应用
    【四十三】图之图的应用
    当图的每条边都被分配了权重时,我们就有了一个加权图,如果边的权重被忽略,那么可以将(每条边的)权重都视为1(译者注:权重都是一样,也就是无权重)。
  • 【八】贪心算法
    【八】贪心算法
    贪心算法是所有算法中最简单,最易实现的算法,该算法之所以“贪心”,是因为算法中的每一步都追求最优的解决方案。