C#无法访问类的基本属性(仅继承)

时间:2013-09-21 20:34:17

标签: c# oop inheritance visual-studio-2012 properties

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

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 个答案:

答案 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