如何在C#中实现多态性

本文关键字:实现 多态性 | 更新日期: 2023-09-27 18:25:57

我是C#的新手。我试图检查如何在C#中实现多态性,但我弄不清楚哪种方法是实现多态性。我使用下面给出的代码,输出是A的方法。

class A
{    
    public void Display()
    {
        Console.WriteLine("A's Method");
    }
}
class B : A
{
    public void Display()
    {
        Console.WriteLine("B's Method");
    }
}
class Polymorphism
{
    public static void Main(string[] args)
    {
        A a = new B();
        a.Display();
        Console.ReadKey();
    }
}


但是,当我定义Display()方法如下所示时,就会调用B的输出方法。

class A
{    
    public virtual void Display()
    {
        Console.WriteLine("A's Method");
    }
}
class B : A
{
    public override void Display()
    {
        Console.WriteLine("B's Method");
    }
}

那么,我是通过什么方式实现多态性的,这两种方式之间的区别是什么,以及哪种方式应该更适合重写。任何帮助都是可观的。

如何在C#中实现多态性

虚拟方法提供多态性,因为子类可以覆盖行为。如果不使用虚拟方法,则所有类型都继承了其他类型中定义的内容,但不能用新的行为替换这些继承的行为。

在第一种情况下,调用A的方法是因为您有对A的引用,并且在编译时解析非虚拟方法。允许A变量引用B对象,因为B是一个A。(请注意,向下转换对象并调用结果将调用B的方法:((B)a).Display();。)

在第二种情况下,调用B的方法是因为该方法是虚拟的,并且虚拟方法在运行时被解析为,这是基于对象的实际类型,而不是它碰巧存储在其中的引用类型。

简单地说,多态性是指您可以将派生对象视为祖先对象,并使所有派生功能正确运行。

在第一个示例中,您隐藏了祖先方法,因此如果将派生对象视为祖先,那么它的行为就如同祖先。这不是多态性的。

在第二个示例中,您正在重写祖先方法,因此当您将对象视为祖先时,它的行为仍然与派生对象类似。这个多态性的。

虽然这是一个简单的概念,但也有很多不那么简单的副作用和条件。例如,请参阅利斯科夫替代原则(我不会在这里讨论)。还有其他的原则和理论在起作用。但是,只要理解C#中的多态性主要是通过继承实现的就足够了(尽管它也可以通过动态对象的ducktype和泛型的泛型类型来实现)。

还有几种类型的多态性。。。有关更多信息,请参阅维基百科条目:

http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

在一种情况下,你正在隐藏方法,而在另一种情况中,你正在覆盖它。不要犹豫,借助谷歌,你会得到非常有用的文章或答案。即使在SO上,你也会遇到很多类似的问题。

   class A
{    
    public void Display()
    {
        Console.WriteLine("A's Method");
    }
}
class B : A
{
    public void Display()
    {
        Console.WriteLine("B's Method");
    }
}

在上面的示例中,您正在执行阴影或方法隐藏。如果你使用下面代码中的new关键字,你甚至可以得到同样的结果。如果你在子类的方法中使用don-write override,派生类中的方法不会覆盖基类中的方法,它只是隐藏它。

   public new void Display()
        {
            Console.WriteLine("B's Method");
        }

重写修饰符是扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现所必需的。所以要实现覆盖,必须使用第二个例子中使用的override关键字。

简单地说,如果一个方法没有重写派生方法,它就会隐藏它。重写方法提供了从基类继承的成员的新实现。

您也可以在MSDN上查看何时进行方法隐藏或何时进行重写。

根据评论部分的讨论,我附上以下代码。希望它能帮助你。

    using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
             A a=new A();
             a.Display();//Parent's Method
             B b =new B();
             b.Display();//Child's Method
             **A ab = new B();
             ab.Display();//Parent's Method**
             Console.ReadKey();
             Parent parent = new Parent();
             parent.Display();//Parent's Method
             Child child = new Child();
             child.Display();//Child's Method
             **Parent ParentChild = new Child();
             ParentChild.Display();//Child's Method**
             Console.ReadKey();
        }
        class A
        {
            public virtual void Display()
            {
                Console.WriteLine("Parent's Method");
            }
        }
        class B : A
        {
            public void Display()
            {
                Console.WriteLine("Child's Method");
            }
        }
        class Parent
        {
            public virtual void Display()
            {
                Console.WriteLine("Parent's Method");
            }
        }
        class Child : Parent
        {
            public override void Display()
            {
                Console.WriteLine("Child's Method");
            }
        }
    }
}