0

とすれば

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;
}

誰かが理由を説明してもらえますか

PartnerOrder order = repo.FindOrderByConfirmationNumber(confirmationNumber)

AnonymousOrder のタイプを返し、PartnerOrder のタイプを返すようにするにはどうすればよいですか?

4

2 に答える 2

1

FindOrderAbstractOrder;のタイプを返します。その宣言を見てください。返されるオブジェクトは のインスタンスである可能性がありますが、から継承されているため、AnonymousOrderすべてのAnonymousOrderインスタンスもインスタンスです。AbstractOrderAnonymousOrderAbstractOrder

あなたの本当の問題は、AnonymousOrderインスタンスをPartnerOrder参照に割り当てようとしていると思います。どちらのタイプも他方から派生していないため、これは機能しません。

ただし、これは機能します。

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

または、戻り値の型をテストできます。

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

AnonymousOrder を返す ConfirmationNumber の PartnerOrder インスタンスが本当に必要な場合は、AnonymousOrder インスタンスを受け取り、PartnerOrder インスタンスを返すメソッドが必要になります。または、おそらく、設計を再考する必要があります。

于 2012-10-03T18:13:44.467 に答える
1

AbstractOrder は Abstract クラスです。オブジェクトは抽象クラスにしかなれず、基本クラスとして継承できますが、常に他のものでもあります。

最も具体的なクラスであるAnonymousOrder型を返しますが、AbstractOrderでもあります。これを単なる AbstractOrder として扱うことができ、何も影響を受けません。

于 2012-10-03T18:05:44.137 に答える