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

本文关键字:属性 继承 访问 | 更新日期: 2023-09-27 18:32:12

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

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?

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

谢谢!

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

不能

直接使用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成员。即使确实有更具体的类实例分配给该属性。

您需要区分实际类型和声明的类型。在你的例子中,虽然你实例化了一个cocktail,你把它作为一个Drink引用,它不公开任何属性。

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

((cocktail)order.Drink).AlcoholContent = 4;

你可以投射它。尝试:

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

如果要获取具体的类属性,则应显式转换为具体类型。

(顺序。作为鸡尾酒饮用)。酒精C意图<- 工作得很好

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