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

AbstractOrder 是一个抽象类。没有对象只能是抽象类,它可以作为基类从它继承,但它也总是其他东西。

它返回类型 AnonymousOrder,这是它最具体的类,但它也是一个 AbstractOrder。你可以把它当作一个 AbstractOrder,什么都不应该受到影响。

于 2012-10-03T18:05:44.137 回答
1

FindOrder正在返回一种AbstractOrder; 看看它的声明。它返回的对象可能是 的实例AnonymousOrder,但所有AnonymousOrder实例也是AbstractOrder实例,因为AnonymousOrder继承自AbstractOrder

我认为您真正的问题是尝试将AnonymousOrder实例分配给PartnerOrder引用。这是行不通的,因为这两种类型都不是从另一种派生的。

但是,这将起作用:

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

或者,您可以测试返回值的类型:

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

如果您确实需要一个 PartnerOrder 实例来获得返回 AnonymousOrder 的确认号码,那么您将需要一个采用 AnonymousOrder 实例并返回 PartnerOrder 实例的方法。或者,也许,您应该重新考虑您的设计。

于 2012-10-03T18:13:44.467 回答