如何在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");
}
}
那么,我是通过什么方式实现多态性的,这两种方式之间的区别是什么,以及哪种方式应该更适合重写。任何帮助都是可观的。
虚拟方法提供多态性,因为子类可以覆盖行为。如果不使用虚拟方法,则所有类型都继承了其他类型中定义的内容,但不能用新的行为替换这些继承的行为。
在第一种情况下,调用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");
}
}
}
}