什么是多态性?

SBS21332108

新成员
已加入
2014年3月8日
留言内容
1
编程经验
Beginner
嗨,C#程序员,我需要帮助,任何人都可以向我解释什么是多态以及它与C#的关系。谢谢:关注:
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
从已经读过的书中,您不了解什么?那里已经有很多信息,所以如果您不明白我们已经读过的内容,那没有意义吗?
 

mp3909

知名会员
已加入
2018年4月22日
留言内容
61
地点
英国
编程经验
3-5
我是C#的新手,想问一些关于多态性的问题,所以我想我将从这个话题继续。
我已经阅读了多态性。

假设我有一个名为Animal的父类和一个称为Dog的子类。狗继承动物。像这样:

C#:
using System;
namespace Polymorphism
{
    class Animal
    {
        public string FirstName = "FN";
        public string LastName = "LN";
        
        public void [COLOR=#0000ff]DisplayFullName[/COLOR]()
        {
            Console.WriteLine(FirstName + " " + LastName);
        }
    }

    class Dog : Animal
    {
        public void [COLOR=#0000ff]DisplayFullName[/COLOR]()
        {
            Console.WriteLine(FirstName + " " + LastName + " - [COLOR=#ff0000]Woof[/COLOR]");
        }
    }

    class Program
    {
        static void Main()
        {
            Animal a = new Dog();
            a.DisplayFullName();
        }
    }
}


现在,据我所知,多态性使您可以声明一个能够指向Child类对象(例如Animal)的Parent类引用变量。 a = new Dog().
我还知道在运行时,变量会更改其类型,即变量 a 从动物变到狗还是从狗变到动物?我不太确定。
我还坚信只有在使用关键字的情况下(即在运行时数据发生更改)"virtual"(在父类方法中称为 DisplayFullName()) 和"override"(在子类方法中称为 DisplayFullName())。我故意在上面的代码中省略了这些关键字,以便它调用Parent类方法而不是child类方法。这是否意味着在特定的运行时间中,该变量未发生隐式数据转换 a?如果是这样,这是否意味着在整个动物中仍然存在动物类型?

现在,当我使用关键字时,情况发生了变化"virtual" and "override"。假设我将这些单词添加到上面的代码中。现在,这是否导致变量 a 在运行时更改t数据类型?如果是这样,我的说法是否正确"在运行期间,变量 a 从动物类型变成狗类型?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
我还知道在运行时,变量会更改其类型,即变量 a 从动物变到狗还是从狗变到动物?我不太确定。

您不会意识到这一点,因为这永远不会发生。什么都不会改变类型。变量“ a”被声明为动物类型,并且始终是该类型。变量是动物类型,它引用狗类型的对象。就是这样,仅此而已。多态性似乎很复杂,因为人们从抽象的角度来考虑它,但是,就像许多OOP一样,它的工作原理与现实世界一样。考虑一个兽医医院。它接受所有类型的动物。您可以将医院的每次约会都视为动物类型的变量。您可以将狗分配给该变量,或者将其分配给猫,蛇或其他任何动物。那正是它在编程中的工作方式。您可以声明特定类型的变量,然后可以将该类型的任何对象分配给该变量,而不管该对象可能是其他更具体的类型。

考虑Windows窗体应用程序中的窗体。它具有类型为Control的ActiveControl属性,它引用当前具有焦点的窗体上的控件。该控件可能是TextBox,Button,ListBox或任何其他可以接收焦点的控件。基于ActiveControl属性,您所知道的只是它是一个控件,因此您只能通过该属性访问Control类的成员。如果要访问更特定类型的成员,则必须将其强制转换为该类型。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
关于“虚拟”和“覆盖”关键字的使用,当派生类声明与基类中的方法具有相同名称和签名的方法时,派生实现可以隐藏或覆盖基本实现。隐藏在VB中称为阴影。覆盖方法时,您将基本实现替换为派生实现。隐藏方法时,基本实现仍然存在,但从派生类型中看不到。对覆盖方法的调用遵循对象的类型,而对隐藏方法的调用遵循引用(变量)的类型。请参阅以下示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass bc1 = new BaseClass();

            bc1.OverriddenMethod();
            bc1.HiddenMethod();

            DerivedClass dc = new DerivedClass();

            dc.OverriddenMethod();
            dc.HiddenMethod();

            BaseClass bc2 = new DerivedClass();

            bc2.OverriddenMethod();
            bc2.HiddenMethod();

            Console.ReadLine();
        }
    }

    public class BaseClass
    {
        public virtual void OverriddenMethod()
        {
            Console.WriteLine("BaseClass.OverriddenMethod");
        }

        public void HiddenMethod()
        {
            Console.WriteLine("BaseClass.HiddenMethod");
        }
    }

    public class DerivedClass : BaseClass
    {
        public override void OverriddenMethod()
        {
            Console.WriteLine("DerivedClass.OverriddenMethod");
        }

        public new void HiddenMethod()
        {
            Console.WriteLine("DerivedClass.HiddenMethod");
        }
    }
}

如果执行该代码,则您会发现,前两行调用了基类的方法,而后两行调用了派生类的方法。对于最后两行,您有一个BaseClass类型的引用,该引用引用了DerivedClass类型的对象。当您在其上调用重写的方法时,您将获得派生的实现,即,它遵循对象的类型。当您在其上调用隐藏方法时,您将获得基本实现,即它遵循引用的类型。

还要注意,虽然不必这样做,但在隐藏基本成员时应该使用'new'关键字,如本例中所示。
 
已加入
一月10,2019
留言内容
6
编程经验
3-5
来自其他地方的报价
单词多态性意味着具有多种形式。在面向对象的编程范例中,多态通常表示为“一个接口,多个功能”。
多态可以是静态的也可以是动态的。在静态多态中,对函数的响应是在编译时确定的。在动态多态中,它是在运行时决定的。
[h = 2]静态多态性[/ h]在编译期间将函数与对象链接的机制称为早期绑定。也称为静态绑定。 C#提供了两种实现静态多态的技术。他们是 ?

  • Function overloading
  • Operator overloading
[h=2]动态多态[/ h] C#允许您创建用于提供接口的部分类实现的抽象类。当派生类从其继承时,实现就完成了。抽象类包含抽象方法,这些方法由派生类实现。派生类具有更专业的功能。
这是有关抽象类的规则吗?

  • 您不能创建抽象类的实例
  • 您不能在抽象类之外声明抽象方法
  • 当一个类被声明为密封的时,它不能被继承,抽象类也不能被声明为密封的。
 

Realme

活跃成员
已加入
2019年7月2日
留言内容
33
编程经验
Beginner
多态是为了使对象中的方法和实例得到重用。如果object是主要功能,而不是重新邀请转轮,则使用相同的转轮,但为其赋予新的更新/功能。

这是面向对象编程的唯一目的。抬头看看"面向对象的程序设计"你会得到的。仅通过查看代码,您就可以了解灵魂,而不是灵魂的描述

多态性是指"many shapes"来自希腊语,就像你有头一样,马也一样,但是吃,看,听也一样。

想想达芬奇,一个圆圈中的人会创造出许多形状
 
Last edited:
最佳 底部