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?
为什么?我以为我确实创造了一个鸡尾酒课,而不仅仅是一个饮料?我做错了什么?
谢谢!
不能
直接使用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意图<- 工作得很好
或
您可以在饮料类中将虚拟属性保留为酒精含量,并在鸡尾酒类中覆盖它。然后,您可以访问这些属性。