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

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?

为什么会这样?我以为我创建了一个鸡尾酒类,而不仅仅是饮料? 我做错了什么吗?

谢谢!


6
因为 Drink 没有公开一个 AlcoholContent 属性,但是 Cocktail 有。 - Daniel Kelley
4个回答

9
您不能直接使用 AlcoholContent 属性,因为您是通过 Drink 引用使用 Coctail 实例的。
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类指定的成员。即使实际上将更具体的类实例分配给该属性。


嗯,怎么样来一杯“VirginCubaLibre:饮料”?我认为它应该返回0的酒精含量...而“SoftDrink”更像是一种“饮料”,它本身由“Drink”实现,但也可以由“AppleJuice”实现 :-) - Mathieu Guindon

2
你需要区分实际类型和声明类型。在你的情况下,尽管你实例化了一个 "cocktail",但你将其引用为 "Drink",它不公开任何属性。
要访问在 "cocktail" 类中定义的属性,你需要对你的引用进行类型转换:
((cocktail)order.Drink).AlcoholContent = 4;

1
您可以进行投射。尝试一下:

Order order = new Order();
order.Drink = new cocktail();
(order.Drink as cocktail).AlcoholContent = 0 ; // please dont drink

1
如果您想获取具体的类属性,则需要显式地将其转换为具体类型。
(order.Drink as Cocktail).AlcoholContent <- 这样做完全没问题
或者
您可以在Drink类中保留一个虚拟属性作为Alcoholicontent,并在cocktail类中覆盖它。然后您就可以访问这些属性了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接