这是我的代码(应该很容易理解我要实现的目标):

public class Order
{
    private Drink drink;
    public Drink Drink {get { return drink; } set { drink = value; }}
}

public class Drink
{
    enum colour
    {
        Red, Transparent
    };
}

public class cocktail : Drink
{
    private int alcoholContent;
    public int AlcoholContent  { get { return alcoholContent; } set { alcoholContent = value; } }
}

然后我试图访问这些属性,但它们不在那里:
Order order = new Order();
order.Drink = new cocktail();
order.Drink. <- no alcohol content?

为什么?我以为我真的创造了一个鸡尾酒班,而不仅仅是一杯?
我做错什么了?
谢谢您!

最佳答案

您不能直接使用AlcoholContent属性,因为您正在通过Coctail引用使用Drink实例。

Order order = new Order();
order.Drink = new cocktail();
//  order.Drink. <- no alcohol content?
((Coctail)order.Drink).AlcoholContent <- works just fine

必须使用显式(Coctail)转换才能使用特定于Coctail类的成员。
为什么?考虑一种情况,其中有另一个名为SoftDrink的类:
public class SoftDrink : Drink
{
}

您仍然可以将SoftDrink实例分配给order.Drink
Order order = new Order();
order.Drink = new SoftDrink();
//  order.Drink. <- no alcohol content? It's a SoftDring!!

而且由于order.Drink属性可以处理每个Drink,因此只能使用为Drink类指定的成员。即使有一个更具体的类实例分配给该属性。

09-27 13:59