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#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

c# 的类的属性与类的变量有啥区别?不是都能用"."访问吗?

5继承与派生2-访问控制

C#中继承类为啥可以通过属性访问基类的私有字段。

继承知识总结

C# 包含继承类的基类数组,访问非继承字段