2013-04-05 2 views
-4

멍청한 질문이지만 조금 어림짐작합니다.기본 클래스 확장 된 개체 설명

예 :

BaseClass bc = new ExtendedClass(); //Assume ExtendedClass inherits from BaseClass 
((BaseClass)bc).ExtendedMethod(); 
bc.ExtendedMethod(); 
((ExtendedClass)bc).ExtendedMethod(); //overridden in ExtendedClass 

ExtendedClass ec = new ExtendedClass(); 
((BaseClass)ec).ExtendedMethod(); 
ec.ExtendedMethod(); 
((ExtendedClass)ec).ExtendedMethod(); //overridden in ExtendedClass 

?

bc.ExtendedMethod();ec.ExtendedMethod();은 런타임에 어떤 구현을 호출합니까? 그들은 다를 것인가? 캐스트 된 호출이 클래스 내의 특정 구현을 호출한다고 가정합니다.

편집 : 관련 태그가 추가되었습니다.

+3

왜 그것을 샷 자신, 설치베이스와 아이 클래스 샘플 프로젝트를 포기하고 그냥 단지 확장 내에 표시 방법 확장 된 기본 클래스에서 사용할 수있을 캐스트를 필요로의 – Habib

+0

표시되지 않습니다 객체와 저는 실제로이 * ty alex *의 실제 개념을 파악할 수 있는지 실제로보고 있었고 모든 프로그래머가이를 알아 내기 위해 이것을 테스트 할 필요가 없도록 실제로이 어딘가에 유용합니다. – Izzy

+1

의존; ExtendedMethod 가상입니까? –

답변

2
public class Base 
{ 
    public void Extends() 
    { 
     Console.WriteLine("Base class"); 
    } 
} 

public class Extend : Base 
{ 
    public new void Extends() 
    { 
     Console.WriteLine("Extend class"); 
    } 
} 


public class Program 
{ 
    public static void Main() 
    { 

     Base b = new Base(); 
     b.Extends(); 

     Extend e = new Extend(); 
     e.Extends(); 

     Base be = new Extend(); 
     be.Extends(); 

     Console.Read(); 

    } 

} 

결과 :

Base class 
Extend class 
Base class 

참고 또한 기본을 Extends 기능을 숨길 Extend 클래스의 new 키워드를 사용할 수 있습니다.

public new void Extends() 
{ 

} 
+1

Ahh ok - 가상 + 무시를 사용하면 마지막 하나가 확장됩니다. 하지만 "new"를 사용하면 마지막은 Base입니다. – Izzy

+0

편집 : 가상 + "새"* – Izzy

2

ExtendedClass 인스턴스를 만들 때 세 가지 경우 모두 ExtendedMethod의 재정의 된 구현이 호출됩니다. 결국, 이것은 polymorphism이 전부입니다. 다음과 같은 출력