2012-10-03 4 views
0

에 파생 형 주조는기본 유형

PartnerOrder order = repo.FindOrderByConfirmationNumber(confirmationNumber) 

이 AnonymousOrder의 유형을 반환하고 나는 그것이 PartnerOrder의 형식을 반환받을 방법을 왜

public abstract class AbstractOrder 
{ 
    //some properties... 
} 

public class AnonymousOrder:AbstractOrder 
{ 
    //some properties... 
} 


public class PartnerOrder:AbstractOrder 
    { 
     //some properties... 
    } 


public AbstractOrder FindOrderByConfirmationNumber(string confirmationNumber) 
{ 
    ICriteria criteria = 
     Session.CreateCriteria(typeof(AbstractOrder)) 
      .SetMaxResults(10) 
      .AddOrder(Order.Desc("PurchasedDate")) 
      .Add(Restrictions.Eq("ConfirmationNumber", confirmationNumber)); 
    var l = criteria.List<AbstractOrder>(); 
    AbstractOrder ao = l[0] as AbstractOrder; 
    return ao as AbstractOrder; 
} 

누군가가 설명해 주시겠습니까 감안할 때?

+1

* 어떻게 AnonymousOrder * 유형을 반환하는지 알고 계십니까? 코드가 실제로 올바르게 작동 –

+1

typeof (order) .Name의 결과는 무엇입니까? – IslandCow

+0

추상 형식을 반환 하시겠습니까? AbstractOrder처럼 사용하십시오. 파생 할 필요가 없습니다. 파생 클래스가 작동해야하는 계약을 따르는 한 입니다.) – SparK

답변

1

FindOrder AbstractOrder 유형을 반환하는입니다. 그 선언을 보라. 개체AnonymousOrder의 인스턴스 일 수 있지만 AnonymousOrderAbstractOrder에서 상속되기 때문에 AnonymousOrder 인스턴스는 모두 AbstractOrder 인스턴스입니다.

실제 문제는 AnonymousOrder 인스턴스를 PartnerOrder 참조에 할당하려고합니다. 두 유형 모두 다른 유형에서 파생되지 않았으므로 작동하지 않습니다.

이,하지만 작동합니다

AnonymousOrder order = (AnonymousOrder)repo.FindOrderByConfirmationNumber(confirmationNumber); 

을 다른 방법으로, 반환 값의 유형을 테스트 할 수 : 당신이 정말를 반환하는 confirmationNumber에 대한 PartnerOrder 인스턴스가 필요한 경우

AbstractOrder order = repo.FindOrderByConfirmationNumber(confirmationNumber); 
PartnerOrder partnerOrder = order as PartnerOrder; 
if (partnerOrder != null) 
    //... 

을 AnonymousOrder를 사용하면 AnonymousOrder 인스턴스를 가져 와서 PartnerOrder 인스턴스를 반환하는 메서드가 필요합니다. 아니면 아마도 디자인을 재고해야합니다.

+0

감사합니다 - 디자인을 다시 생각해보고 싶지만 그 옵션이 없으므로이 두 가지를 매핑하는 방법을 사용할 것입니다. – user1069733

1

AbstractOrder는 Abstract 클래스입니다. 어떤 객체도 추상 클래스 일 수는 없으며 기본 클래스로 상속받을 수 있지만 항상 다른 것입니다.

반환 유형은 가장 구체적인 클래스 인 AnonymousOrder뿐 아니라 AbstractOrder입니다. AbstractOrder로만 처리 할 수 ​​있습니다. 아무 것도 영향을 미치지 않아야합니다.

+0

고마워 - 어떻게 그것을 PartnerOrder로 캐스팅 할까? 내가 시도 할 때 'AnonymousOrder'유형의 객체를 'PartnerOrder'유형으로 캐스팅 할 수 없다. – user1069733