7

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

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?

这是为什么?我以为我确实创建了一个鸡尾酒课,而不仅仅是一个饮料?我究竟做错了什么?

谢谢!

4

4 回答 4

9

您不能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.Drinkproperty 可以处理every Drink,所以您只能使用为Drinkclass 指定的成员。即使确实有一个更具体的类实例分配给该属性。

于 2013-09-21T20:39:17.470 回答
2

您需要区分实际类型和声明的类型。在您的情况下,尽管您实例化 a cocktail,但您将其引用为 a Drink,它不会公开任何属性。

要访问cocktail类中定义的属性,您需要对引用进行类型转换:

((cocktail)order.Drink).AlcoholContent = 4;
于 2013-09-21T20:38:53.943 回答
1

如果您想获得具体的类属性,则必须显式转换为具体类型。

(order.Drink as Cocktail).AlcoholC 内容 <- 效果很好

或者

您可以将虚拟属性保留为 Drink 类中的酒精含量,并在鸡尾酒类中覆盖它。然后您可以访问这些属性。

于 2013-09-21T20:44:00.103 回答
1

你可以投它。尝试:

Order order = new Order();
order.Drink = new cocktail();
(order.Drink as cocktail).AlcoholContent = 0 ; // please dont drink
于 2013-09-21T20:46:10.470 回答