2014-10-09 74 views
1

我是C#的新手。我试图检查在C#中如何实现多态,并且我很困惑,哪种方法是实现多态。我使用下面给出的代码,输出是A的方法。如何在C#中实现多态#

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


但是,当我定义显示()方法下面然后B的输出方法被称为给出。

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

因此,通过什么样的方式,我实现多态,什么是两者的方式,哪一个应该是最好的覆盖之间的差异。任何帮助将是可观的。

+0

可能重复http://stackoverflow.com/questions/3838553/overriding-vs-method-hiding) – 2014-10-09 05:12:47

回答

4

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

在第一种情况下,A的方法被调用,因为你必须一个A的引用,和非虚拟方法在编译时解决B对象允许被A变量引用,因为Bis-aA。 (请注意,向下转换的对象并调用结果将调用B's法:((B)a).Display();

在第二种情况下,B的方法被调用,因为该方法是虚拟的,并且虚拟方法在运行时解决,基于所述实际类型的对象,不引用的类型它正好被存储英寸

+0

@cdhowle这意味着第二个例子可以在运行时多态性... – Krish 2016-01-20 06:02:58

1

在一种情况下你正在做的方法的隐藏,并且在另一个要覆盖。请不要犹豫借助谷歌的帮助,你会得到非常有用的文章或答案。即使在SO,你会得到很多类似的问题。

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

在上面的例子中,你正在做的阴影或方法,如果你在下面code.if使用new关键字像hiding.You可以得到即便是同样的结果您使用在小孩的方法不写覆盖类,派生类中的方法不会覆盖基类中的方法,它只是隐藏它。

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

override修饰符需要扩展或修改抽象或虚拟实现继承的方法的,属性,索引,或event.So到aceive覆盖你必须使用正在其中使用在第二示例override关键字。

简而言之,如果一个方法不重写派生方法,它将隐藏它。一个覆盖方法提供了一个从基类继承的成员的新实现。

你也可以在这里检查MSDN什么时候做方法隐藏或什么时候重写。

根据评论部分的讨论,我附上了code.Hope它会帮助你。

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"); 
      } 
     } 
    } 
} 
+0

基类的方法或函数可用于子类(派生)类而不使用“覆盖“关键字。编译器隐藏了基类的函数或方法。这个概念被称为阴影或方法隐藏。在隐藏或方法隐藏中,子(派生)类具有其自己的函数版本,同样的函数也可以在基类中使用。 – F11 2014-10-09 05:01:31

+0

如果我们使用覆盖,它会改变\覆盖子类中基类虚拟方法的定义。 – F11 2014-10-09 08:36:49

+0

在代码中,B和C类都打印他们自己的方法,然后有什么不同。 } } 类B: { 公共覆盖无效显示() { Console.WriteLine( “B法”); } } 类C:甲 { 公共新空隙显示() { Console.WriteLine( “C法”); } } – prashant 2014-10-09 09:16:57

2

简而言之,多态性是指您可以将派生对象视为祖先对象,并使派生的所有功能都正常工作。

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

在第二个示例中,您重写了祖先方法,因此当您将该对象作为祖先对待时,它仍然像派生对象那样工作。这多态。

虽然这是一个简单的概念,但还有很多不那么简单的副作用和条件。例如,请参阅Liskov Substitution Principle(我不会在这里进入)。还有其他原则和理论也在玩。但是,足够理解C#中的多态性主要是通过继承来实现的(尽管它也可以通过ducktyping与动态对象和泛型的泛型类型来实现)。

也有几种类型的多态性...看到更多的Wikipedia条目:

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

[重写VS方法隐藏](的