2013-04-19 2 views
1

Difference between Abstract and Virtual Function에서 추상 및 가상 메서드의 차이점을 살펴 보겠습니다. 오버라이드 및 새 기능과 혼동 됨 C#

나는

이의이

class MainClass 
{ 
    public static void Main() 
    {   
     DerivedClass _derived = new DerivedClass();   
     _derived.SayHello();   
     _derived.SayGoodbye(); 
     Console.ReadLine(); 
    }  
} 

public abstract class AbstractClass 
{ 
    public void SayHello() 
    { 
     Console.WriteLine("Hello - abstract member\n"); 
    } 

    public virtual void SayGoodbye() 
    { 
     Console.WriteLine("Goodbye- abstract member \n"); 
    } 
    //public abstract void SayGoodbye(); 
} 


public class DerivedClass : AbstractClass 
{ 
    public new void SayHello() 
    { 
     Console.WriteLine("Hi There - Hiding base class member"); 
    } 

    //public override void SayGoodbye() 
    //{ 
    // Console.WriteLine("See you later - In derived class OVERRIDE function"); 
    //} 

    public new void SayGoodbye() 
    { 
     Console.WriteLine("See you later - In derived class I'm in NEW member"); 
    }   
} 

아래와 같이 샘플 코드를 살펴 보자 virtualnew에 관한 의심을 가지고 내 질문 : overridenew는 동일한 기능을 수행하는 방법 파생 클래스에서 , 내가 SayGoodbye라고 전화하면? 내가 그들 중에서 선택/선호하기 위해 갈 필요가있을 때? 어느 시나리오에서 내가 그들 가운데 선호해야 할 것인가?

+3

를 사용하는 경우 http://stackoverflow.com/questions/392721/difference-between-shadowing-and-overriding -in-c – Oded

+0

질문/답변 @Oded 링크를 사용하면 질문에 완벽하게 답변 할 수 있습니다. –

+0

위의 코드를 사용해보십시오. Console.WriteLine ((AbstractClass) _derived.SayGoodbye());'. 기본 클래스 메소드를 실행합니다. 당신이 숨겨진 대신에 무효화 되었다면 그런 일은 일어나지 않을 것입니다. –

답변

2
  • 클래스 구성원을 virtual으로 표시하면 하위 클래스에서 재정의 할 수 있습니다.
  • 당신은 당신이 모두 newoverride 키워드를 사용할 수있는 서브 클래스 (기본 클래스에서 가상 선언)하는 방법을 변경하려면 있지만

    사이에 차이가있는 경우. 을 사용하는 경우 : 하위 클래스의 객체를 기본 클래스로 캐스팅 한 다음 해당 메서드를 호출하면 기본 클래스 구현이

    으로 실행됩니다. 오버라이드를 사용하는 경우 : 하위 클래스의 객체를 기본 클래스로 캐스팅 한 다음 해당 메서드를 호출하면 하위 클래스 구현이 실행됩니다. 여기

코드

AbstractClass instance = new DerivedClass(); 
instance.SayGoodbye(); //See you later - In derived class I'm in NEW member 

입니다하지만 override

AbstractClass instance = new DerivedClass(); 
instance.SayGoodbye(); //Goodbye- abstract member \n 
+0

하위 클래스의 개체를 기본 클래스로 캐스팅하지 않은 경우? 어떤 차이가있을 것입니까? – venkat

+0

@sukumar이 경우 답을 잘 모르는 경우 검색하거나 다른 질문으로 질문 할 수 있습니다. –