2014-09-28 6 views
0

나는의 DependsOn을 implemnts 기본 클래스() 나는이 기본 클래스를 확장 한제네릭 형식을 사용할 때 기본 클래스 대신 상속 된 클래스에서 메서드를 호출하려면 어떻게해야합니까?

public class Entity 
{ 
    protected Entity() { } 

    public virtual List<Type> DependsOn() 
    { 
     return new List<Type>(); 
    } 
} 

있습니다.

public class Waveform : Entity 
{ 
    public virtual new List<Type> DependsOn() 
    { 
     return new List<Type> {typeof(Scenario)}; 
    } 
} 

나는 그 대신 상속 클래스의 기본 클래스에서의 DependsOn 메서드를 호출 (대신이 빈리스트가 반환, 다음 코드는 "새 목록 {대해서 typeof (시나리오)}"를 반환 할 것으로 예상합니다. I를 뿐만 아니라 디버거를 사용하여이 문제를 확인했습니다.)

public virtual List<Entity> FindParents<T>(T possibleChild) where T : Entity 
{ 
    List<Type> dependsOnTypes = possibleChild.DependsOn(); 
} 

public void DeleteEntity<T>(T entity) where T : Entity 
{ 
    List<Entity> parents = FindParents<T>(entity); 
} 

Waveform waveform = new Waveform(); 
DeleteEntity<Waveform>(waveform); 

답변

4

사용 override 대신 virtual new.

virtual new 새로운 슬롯을 생성하고 자신을 virtual하지만 기본 클래스와 VTABLE 슬롯을 공유하지 않는 새로운 함수를 정의한다.

함수에 대해 new 키워드를 사용할 때마다 기본 클래스에 같은 이름의 함수와 관련이 없다고 생각해야합니다. new을 사용하면 예를 들어 함수의 서명을 완전히 변경할 수 있습니다.

+0

어떤 이유로 그것을 : 아래 그림과 같이 유일한 방법은 원래의 형식으로

대신 개체의, 그 다음 올바른 버전을 호출합니다, 당신은 파형 객체를 사용하는 것입니다 원하는 올바른 방법을 호출 "기본 클래스에서 같은 이름을 가진 함수와 관련이없는 것"이라고 말할 때까지 실제로 클릭하지 않았습니다. – Miebster

2

실제로 기본 클래스를 확장하지 않았으므로 같은 이름으로 새 메서드를 만들었습니다. 다음과 같이 override 키워드를 사용

public class Waveform : Entity 
{ 
    public override List<Type> DependsOn() 
    { 
     return new List<Type> {typeof(Scenario)}; 
    } 
} 
1

왜 당신이이 경우에 오버라이드 (override) 할 필요 대신 새가의 방법은 런타임에 자식 클래스를 포함하는 기본 클래스 객체에서 호출됩니다. 실제 전달 된 요소는 Entity 유형이며 런타임시 파형으로 채워지지만 하위 클래스 구현이 기본 클래스 구현을 숨기므로 런타임시 Entity 객체는 무시를 인식하지 못합니다.

class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      Waveform waveform = new Waveform(); 
      p.DeleteEntity<Waveform>(waveform); 
     } 

     public void DeleteEntity<T>(T entity) where T : Waveform 
     { 
      List<Entity> parents = FindParents<T>(entity); 
     } 

     public virtual List<Entity> FindParents<T>(T possibleChild) where T : Waveform 
     { 
      List<Entity> dependsOnTypes = possibleChild.DependsOn(); 
      return dependsOnTypes; 
     }   
    } 

    public class Entity 
    { 
     protected Entity() { } 

     public virtual List<Entity> DependsOn() 
     { 
      return new List<Entity>(); 
     } 
    } 

    public class Waveform : Entity 
    { 
     public virtual new List<Entity> DependsOn() 
     { 
      return new List<Entity> { new Scenario() };   
     } 
    } 

    public class Scenario: Entity 
    { 
     int x; 
     float y; 
    }