【问题标题】:C# Can't access base properties of a class (only inherited)C# 无法访问类的基本属性(仅继承)
【发布时间】: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 属性 - 鸡尾酒会。

标签: c# oop inheritance visual-studio-2012 properties


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-23
        • 2019-10-21
        • 2014-11-10
        • 2017-09-01
        • 2011-06-18
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        相关资源
        最近更新 更多