2014-10-09 4 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의 출력 메소드가 호출 될 때 주어진 아래 I 디스플레이() 메소드를 정의 할 때. 그래서 다형성을 달성하고 무엇을하고 어떤 방법으로

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) –

답변

4

가상 메서드는 다형성을 제공하므로 하위 클래스가 동작을 재정의 할 수 있습니다. 가상 메서드를 사용하지 않으면 다른 형식에서 정의 된 것을 상속하는 형식이 있지만 상속 된 동작을 새로운 형식으로 바꿀 수는 없습니다. 당신이 A에 대한 참조를 가지고 있기 때문에 첫 번째 경우에

A의 메서드가 호출되고, 비 가상 메소드는 컴파일시에 를 해결됩니다. B은 -A이므로 개체는 A 변수로 참조 할 수 있습니다. (결과를 객체를 downcasting하고 호출하면 B 호출 할 것이라고주의의 방법. ((B)a).Display();를) 두 번째 경우

, B의 방법이 방법은 가상이기 때문에라고하며, 가상 메소드는 런타임에 해결 객체의 실제 유형에 따라는 참조하지 유형이 저장 될 발생합니다.

+0

@cdhowle 두 번째 예제가 런타임 다형성에서 제공 될 수 있다는 것을 의미합니다 ... – Krish

1

경우 하나의 당신이 방법 숨기기를하고있는 또 다른 당신이 말아요가 주저 재정의 Google의 도움을 받아 매우 유용한 기사 또는 답변을 얻을 수 있습니다. SO에도 많은 유사한 질문이 있습니다. 위의 예에서

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

, 당신은 아래 code.if에 같은 새로운 키워드를 사용하는 경우 hiding.You는 심지어 같은 결과를 얻을 수 그림자 또는 메서드를하고있는 당신 아이의 방법으로 재정을 쓰지 않는다 사용 클래스에서 파생 클래스의 메서드는 기본 클래스의 메서드를 재정의하지 않고 단순히 숨 깁니다.

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

재정의 수정이 상속 된 메서드의 추상 또는 가상 구현을 확장하거나 수정하는 데 필요한, 속성, 인덱서, 또는 event.So 당신이 두 번째 예제에서 사용하는 override 키워드를 사용할 필요가 오버라이드 (override) aceive하기 .

간단히 말해서 메서드가 파생 메서드를 재정의하지 않으면 해당 메서드를 숨길 수 있습니다. 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"); 
      } 
     } 
    } 
} 
+0

기본 클래스의 메서드 또는 함수는 "파생 클래스"를 사용하지 않고 하위 (파생 된) 재정의 "키워드. 컴파일러는 기본 클래스의 함수 또는 메서드를 숨 깁니다. 이 개념은 섀도 잉 또는 메서드 숨김이라고합니다. 음영 처리 또는 숨기기에서 하위 (파생 된) 클래스에는 자체 버전의 함수가 있으며 기본 클래스에서도 동일한 함수를 사용할 수 있습니다. – F11

+0

재정의를 사용하면 하위 클래스의 기본 클래스 가상 메서드 정의를 \ 변경하여 무시합니다. – F11

+0

코드에서 B와 C 클래스 모두 자체 메서드를 인쇄 한 다음 그 차이점을 설명합니다 .. 클래스 A { public 가상 void Display() { Console.WriteLine ("A 's Method"); } } 클래스 B, • { 공공 재정의 무효 표시() { Console.WriteLine ("B의 방법"); } } 클래스 C, • { 공공 새로운 무효 표시() { Console.WriteLine ("C의 방법"); } } – prashant

2

는 다형성은 당신이 상위 객체 인 것처럼 파생 된 개체를 처리 할 수 ​​있으며, 모든 올바르게 기능 기능을 파생 때입니다.

첫 번째 예제에서는 상위 메서드를 숨기고 있으므로 파생 개체를 상위 개체로 처리하면 상위 메서드로 동작합니다. 이것은 다형성이 아닙니다.

두 번째 예제에서는 상위 메서드를 재정의하므로 개체를 상위 개체로 처리 할 때 개체가 파생 개체처럼 작동합니다. 이 다형성입니다.

단순한 개념이지만 많은 부작용과 조건이 따르지는 않습니다. 예를 들어 Liskov Substitution Principle (여기서는 다루지 않음)을 참조하십시오. 놀이에 다른 원칙과 이론이 있습니다. 그러나 C#의 다형성은 주로 상속을 통해 이루어집니다 (동적 객체 및 일반 제네릭 입력을 통해 ducktyping을 통해 얻을 수도 있음).

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

[방법 숨어 대 재정의 (의
관련 문제