从派生类型转换为基类型

时间:2012-10-03 17:49:34

标签: c# oop nhibernate

鉴于此

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?

2 个答案:

答案 0 :(得分:1)

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

它返回的类型是AnonymousOrder,它是最具体的类,但它也是一个AbstractOrder。你可以将它视为一个AbstractOrder,不应该有任何影响。

答案 1 :(得分: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)
    //...

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