C# 无法访问类的基本属性(仅继承)
Posted
技术标签:
【中文标题】C# 无法访问类的基本属性(仅继承)【英文标题】:C# Can't access base properties of a class (only inherited) 【发布时间】:2013-09-27 01:20:42 【问题描述】:这是我的代码(应该很容易理解我想要实现的目标):
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?
这是为什么呢?我以为我确实创建了一个鸡尾酒课,而不仅仅是一个饮料? 我做错了什么?
谢谢!
【问题讨论】:
因为 Drink 不会暴露 AlcoholContent 属性 - 鸡尾酒会。 【参考方案1】:如果你想获得具体的类属性,那么应该必须显式地转换为具体类型。
(order.Drink as Cocktail).AlcoholC 内容
或者
您可以将虚拟属性保留为 Drink 类中的酒精含量,并在鸡尾酒类中覆盖它。然后你就可以访问这些属性了。
【讨论】:
【参考方案2】:你可以施放它。试试:
Order order = new Order();
order.Drink = new cocktail();
(order.Drink as cocktail).AlcoholContent = 0 ; // please dont drink
【讨论】:
【参考方案3】:您不能直接使用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 : Drink
怎么样?我认为它应该为酒精含量返回 0.. 而SoftDrink
将更像是一个Beverage
,它本身由Drink
实现,但也由AppleJuice
实现:-)【参考方案4】:
你需要区分实际类型和声明类型。在您的情况下,尽管您实例化了 cocktail
,但您将其引用为 Drink
,它不会公开任何属性。
要访问cocktail
类中定义的属性,您需要对引用进行类型转换:
((cocktail)order.Drink).AlcoholContent = 4;
【讨论】:
以上是关于C# 无法访问类的基本属性(仅继承)的主要内容,如果未能解决你的问题,请参考以下文章
C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]