这是我的代码(应该很容易理解我想要实现的目标):
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?
为什么?我以为我创造了一个鸡尾酒课,而不仅仅是一杯饮品? 我做错了什么?
谢谢!
答案 0 :(得分: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.Drink
属性可以处理每个 Drink
,因此您只能使用为Drink
类指定的成员。即使确实有一个更具体的类实例分配给该属性。
答案 1 :(得分:2)
您需要区分实际类型和声明的类型。在您的情况下,虽然您实例化cocktail
,但您将其引用为Drink
,它不会公开任何属性。
要访问cocktail
类中定义的属性,您需要输入您的引用:
((cocktail)order.Drink).AlcoholContent = 4;
答案 2 :(得分:0)
如果要获取具体的类属性,则必须显式转换为具体类型。
(order.Drink as Cocktail).AlcoholC ontent&lt; - 工作得很好
或者
您可以在Drink类中将虚拟财产保留为Alcoholicontent,并在鸡尾酒类中覆盖它。然后,您可以访问这些属性。
答案 3 :(得分:0)
你可以施展它。尝试:
Order order = new Order();
order.Drink = new cocktail();
(order.Drink as cocktail).AlcoholContent = 0 ; // please dont drink