什么是多态性?

SBS21332108

新成员
加入
2014年3月8日
消息
1
编程经验
Beginner
嗨C#程序员,我需要帮助,任何人都可以向我解释什么是多态性和如何's与c#相关。谢谢:担心:
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
你没有从你已经阅读的内容那里了解什么?有很多信息已经存在,所以如果你不明白,我们的重复你已经阅读了什么?
 

mp3909

众所周知的成员
加入
2018年4月22日
消息
61
地点
英国
编程经验
3-5
我是新的c#,并想问一些关于多态性的问题,所以我以为我会从这个帖子继续。
我已经阅读了多态性。

假设我有一个名叫动物和一个名叫狗的儿童班。狗继承了动物。所以这样的:

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();
        }
    }
}


现在从我所理解的,多态允许您声明能够指向子类对象的父类参考变量即,即动物 a = new Dog().
我也意识到在运行时,变量会改变它类型i.e.变量 a 从动物到狗的变化或从狗到动物改变吗?我不太确定。
只有在我们使用关键字时,我也相信这一点(即在运行时间数据发生变化)"virtual"(在父类方法中调用 displayfullname()) 和"override"(在子类方法中称为 displayfullname())。我在上面的代码中用完这些关键字,以便它调用父类方法而不是子类方法。这是否意味着在特定运行过程中,变量不会发生隐式数据转换 a?如果是这样,那么这是否仍然是一种动物类型?

现在,当我使用关键字时,事情会发生变化"virtual" and "override"。让我们想象一下我将这些单词添加到上面的代码中。现在,这是否导致变量 a 在运行时更改数据类型?如果是这样,我是纠正的说法"在运行时,变量 a 从动物类型到狗类型的变化?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
我也意识到在运行时,变量会改变它类型i.e.变量 a 从动物到狗的变化或从狗到动物改变吗?我不太确定。

你不知道,因为永远不会发生。没有任何改变类型。变量'a'被声明为类型动物,始终是那种类型。变量是型动物,它是指狗的对象。就是这样,就是这样。多态性看起来很复杂,因为人们在摘要中想到它,但就像oop一样,它就像现实世界一样。考虑兽医医院。它接受所有类型的动物。您可以考虑在医院的每次预约,因为具有型动物的变量。您可以将狗分配给该变量,或猫或蛇或其他动物的蛇。完全是它在编程中的工作原理。您声明了特定类型的变量,然后您可以将该类型的任何对象分配给变量,而不管对象可能是什么其他更具体的类型。

在Windows窗体应用程序中考虑表单。它具有一个类型控制的ActiveControl属性,它是指目前具有焦点的表单上的控件。该控件可能是文本框,按钮,列表框或可以接收焦点的任何其他类型的控制。基于ActiveControl属性,您所知道的是它是一个控件,因此您只能通过该属性访问控件类的成员。如果要访问更具体类型的成员,那么您必须像该类型一样投。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
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的引用,它是指类型派发类的对象。当您调用覆盖方法时,您将获得派生实现,即它遵循对象的类型。当您调用隐藏方法时,您将获得基本实现,即,它遵循参考的类型。

另请注意,在您不必的时候,您应该在此示例中挂起基本成员时使用“新”关键字。
 
加入
2019年1月10日
消息
6
编程经验
3-5
引用其他地方
Worm多态性意味着具有多种形式。 inobject导向的编程范例,多态性通常是表示的“一个接口,多函数”。
多态性可以是静态的或动态的。在静态多态性中,对函数的响应是确定的编译时间。在动态多态性中,它是决定的atrun-time。
[H = 2]静态多态性[/ h]在编译时间期间将功能连接的机制被称为早期绑定。 ISALSO称静态绑定。 C#提供两种实现静态多态性的技术。他们是 ?

  • Function overloading
  • Operator overloading
[h=2]动态化阳性[/ h] c#允许您创建用于提供AnInterface的部分类实现的抽象类。当派生类继承它时,实现完成。抽象类包含抽象方法,由派生类实现。派生类具有常见的功能。
以下是关于抽象类的规则?

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

realme.

活跃的成员
加入
2019年7月2日
消息
33
编程经验
Beginner
多态性是为了获得重复使用的对象的方法和实例。如果对象是主函数而不是Reinvite车轮,则使用相同的轮子,但为其提供新的更新/功能。

这是面向对象编程的唯一目的。只是抬头"面向对象的编程"你会得到它。只有通过查找代码,您只需看看灵魂,而不是灵魂的描述

多态性手段"many shapes"从希腊语,就像你有一个头一样,这匹马,但是做同样的事情,吃了,看到了听证会。

想想达芬奇,一个圆圈的人都有许多形状
 
Last edited:
最佳 底部