当前位置: 首页 > 编程语言 > C#

编译时多态和运行时多态分享

时间:2023-04-11 00:33:13 C#

编译时多态和运行时多态为什么重载在C#中叫做编译时多态和覆盖运行时多态?重写函数是具有相同签名但在不同派生类中实现的函数。在编译时,通常使用基类类型来引用对象,但在运行时这个对象可以是派生类型,所以当调用重写方法时,调用的实现取决于正在执行的对象类型在编译时未知的调用(基类型和派生类型)。重载(不是真正的多态性)只是具有相同名称但不同签名的多个函数(想想采用不同数量参数的对象的多个构造函数)。调用哪个方法在编译时是已知的,因为参数是在这个时候指定的。好吧,重载决议(使用哪个方法签名,基于参数1)由编译器完成,而重写决定(使用哪个方法实现,基于方法的目标类型)由CLR在执行时处理。我不经常称重载为“多态”。根据我的经验,这个词通常指的是压倒性的。我想重载确实允许您将一种类型的对象视为另一种类型的对象,尽管不需要涉及重载本身——它只是普通的类型转换。这是一个显示在编译时执行重载选择的示例:usingSystem;classTest{staticvoidFoo(objecta){Console.WriteLine("Objectoverloadcalled");}staticvoidFoo(stringa){控制台。WriteLine("调用了字符串重载");}staticvoidMain(){objectx="hello";福(x);这里调用了Foo(object)重载,因为x在编译时是object类型——它只有在执行时才知道它指的是一个字符串。与这个例子比较:usingSystem;ClassBase{publicvirtualvoidFoo(){Console.WriteLine("Base.Foocalled");}}classDerived:Base{publicoverridevoidFoo(){Console.WriteLine("Derived.Foocalled");}}classTest{staticvoidMain(){Basex=newDerived();x.Foo();这里x的编译时类型是Base,但还是叫Derived类,因为x引用的对象的运行时类型是Derived。1由于方法隐藏等原因,它实际上稍微复杂一些-但在简单的情况下,您可以将其视为只是选择签名。多态性通过继承,一个类可以被用作多个类型;它可以用作自己的类型、任何基类型或任何接口类型(如果它实现了接口)。这称为多态性。多态性意味着具有多种形式。重载和覆盖用于实现多态性。多态分为编译时多态或早期绑定或静态绑定和运行时多态或后期绑定或动态绑定。覆盖-在类及其子类中具有相同参数和相同返回类型的相同方法名称。使用“覆盖”关键字覆盖C#。覆盖方法意味着用处理数据的新方法替换它。重载——相同的方法名不同的参数,可能是也可能不是同一个类自己写的返回类型。编译时多态性或早期绑定编译器识别它必须在编译时执行哪种形式的多态性的多态性称为编译时多态性或早期绑定。早期绑定的优点是执行速度快。缺点是缺乏灵活性,因为编译器在编译期间知道有关该方法的所有信息。早期绑定的示例是重载方法、重载运算符和直接用派生对象调用的重写方法。运行时多态性或后期绑定多态性,其中编译器识别哪种形式的多态性是在运行时而不是编译时执行的,称为运行时多态性或后期绑定。后期绑定的优点是灵活性,缺点是执行速度会很慢,因为编译器必须在运行时获取有关正在执行的方法的信息。后期绑定的一个示例是使用基类对象调用的重写方法。classA{publicvirtualvoidLeg(stringName){}}classB:A{publicoverridevoidLeg(stringName){}}重载示例classA{voida(){}voida(stringName){}}换句话说,“单个对象的多种形式称为多态”。例如:TeamLeader表现得像SubOordinate。团队负责人与他/她的前辈相处得很好。团队领导与其他团队领导相处融洽。组长是一个对象,但是在不同的情况下态度是不同的。方法覆盖和方法隐藏之间的区别方法覆盖允许子类提供基类已经提供的方法的特定实现。子类中的实现覆盖(替换)基类中的实现。关于覆盖要记住的重要一点是执行覆盖的方法是相对于基类中的方法的。当在引用上调用虚方法时,引用引用的对象的实际类型用于确定应使用哪个方法实现。在派生类(子类)中覆盖基类的方法时,将使用派生类中定义的版本。即使调用应用程序不知道该对象是派??生类的实例,也是如此。隐藏在基类中的方法与隐藏在派生类中的方法之间没有任何关系。派生类中的方法隐藏了基类中的方法。编译时多态假设你说你有如下两种方法;因为该方法具有相同的名称但具有不同的参数;它被称为“重载”方法。吃(串食物);吃(串食物,SpoonOrFork);你在晚餐课上使用类似这样的东西{字符串食物=“课程1”;Man.Eat(食物);现在,当你编译这个程序时,编译器确切地知道在编译过程中会调用哪个版本的Eat方法(因为参数不同)。这就是为什么它被称为编译时多态性。运行时多态性publicclasschimp{publicvirtualvoidwalk(){Console.WriteLine("我用4条腿走路");}}publicclassneanderthals:chimp{publicoverridevoidwalk(){Console.WriteLine("我用两条腿走路");}}classProgram{staticvoidMain(string[]args){chimpx=newneanderthals();x.walk();控制台.ReadLine();//这将给出“我正在用两条腿走路”的输出}}在上面的代码中,x是chimp类型。即使编译器认为它会调用chimpanzee中的walk方法;但事实并非如此。由于它依赖于CLR(运行时),因此这种多态性称为“运行时”多态性。多态性多态性意味着多种形式(能够采用多种形式)。在多态中,poly是“许多”的意思,variant是“形式”的意思,所以多态就是多种形式。在多态中,我们将在同一个类中声明具有相同名称和不同参数的方法,或者在不同类中声明具有相同名称和相同参数的方法。多态性是提供以相同名称实现的方法的不同实现的能力。在多态性中,我们有两种不同的类型-编译时多态性(称为早期绑定或重载或静态绑定)-运行时多态性(称为后期绑定或覆盖或动态绑定)多态性意味着我们将声明具有相同名称但不同的方法签名,因此我们将使用相同的方法名称执行不同的任务。这种编译时多态性也称为早期绑定或方法重载。方法重载或编译时多态性意味着具有不同签名(不同参数)的相同方法名称有关更多详细信息,请查看此链接C#中的多态性运行时多态性运行时多态性也称为后期绑定或方法覆盖或动态多态性。运行时多态性或方法覆盖意味着具有相同签名的相同方法名称。在这种运行时多态性或方法重写中,我们可以通过在派生类中创建类似的函数来重写基类中的方法,这可以通过使用继承原则和使用“virtualandoverride”关键字来实现。之所以称为运行时多态性,是因为行为是在运行时而不是编译时确定的。当您调用类似objectVariable.Method()的方法时,您的机器将调用哪个方法将取决于objectVariable中存在该类的哪个实例,这是在您将类的实例分配给它之后决定的。这将发生在运行时,而不是编译时。因此得名“运行时多态性”。您可以在以下位置阅读更多信息:C#示例中的编译时多态性和运行时多态性之间的区别是什么。使用系统;公共类演示{publicstaticvoidMain(String[]args){calcal;添加一个=新添加();卡=一;Console.WriteLine("相加是"+cal.calculate(20,20));subs=newsub();卡=小号;Console.WriteLine("减法是"+cal.calculate(20,20));mulm=newmul();卡=米;Console.WriteLine("乘法是"+cal.calculate(20,20));divd=新的div();卡=d;安慰。WriteLine("除法是"+cal.calculate(20,20));安慰。读线();}}publicabstractclasscal{publicabstractintcalculate(inta,intb);}publicclassadd:cal{publicoverrideintcalculate(inta,intb){returna+b;}}publicclasssub:cal{publicoverrideintcalculate(inta,intb){returnab;}}publicclassmul:cal{publicoverrideintcalculate(inta,intb){returna*b;}}publicclassdiv:cal{publicoverrideintcalculate(inta,intb){returna/b;因为在编译时已经知道调用了哪些重载函数,而覆盖函数并不总是这样。静态多面体的经典示例基于模板元编程或DuckTyping,但不基于方法重载。静态多态意味着定义由编译器完成(静态),而动态多态意味着定义仅在运行时完成(动态)。编译时多态性编译时多态性也称为方法重载。方法重载意味着有两个或多个具有相同名称但不同签名的方法。运行时多态性运行时多态性也称为方法覆盖。方法覆盖是指有两个或多个同名同签名但实现不同的方法以上就是C#学习教程分享的全部内容:编译时多态和运行时多态,如果对大家有用还有我需要的了解更多C#学习教程,希望大家多加关注-本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: