【问题标题】:Accessing child class property访问子类属性
【发布时间】:2017-02-09 05:51:08
【问题描述】:

我有 2 个以这种方式继承的类

public class PartsParent
{

}
public class PartsCar : PartsParent
{   
    public int WheelRadius { get; set; }       
    public int Price { get; set; }
}

public class PartsBike : PartsParent
{

    public int Length { get; set; }       
    public int Weight { get; set; }       
    public int Price { get; set; }
}

我有一个接受 PartsParent 类作为参数的函数,我如何在函数内将其转换为 partsCar / 作为 PartsBike 并访问 Price WheelRadius 等属性?

private int PriceCollection(PartsParent mainObject)
{

  int _price=0;
  mainObject.OfType(PartsCar).Price;// something similar?? 
  return _price;
}

【问题讨论】:

  • ((PartsCar)mainObject).WheelRadius 应该工作。但是,如果必须将对象强制转换为子类型,则应尝试重新设计它。
  • 顺便说一句,您应该在PartsParent 中定义Price,因为您的所有子类型都需要价格。如果是这样,您无需转换即可访问mainObject.Price
  • @J.C 是的,你是对的,公共属性应该只是 Parent 类的一部分,而有问题的对象属性只是一个示例。你的建议解决了我的问题
  • 当然,这段代码应该可以工作。但是,我建议您考虑重新设计您的程序。就像@AymenDaoudi 的回答一样,将对象转换为子类型没有意义。

标签: c# linq class inheritance


【解决方案1】:

好吧,您正试图将父类型转换为子类型,这实际上是不可能的,为什么?

答案是,您尝试转换为子 C1 的父 P 实际上可能是 C2 类型,因此转换无效。

解释这一点的最好方法是我在 stackoverflow 上某处读到的一句话

你不能把哺乳动物变成狗——它可能是猫。

您不能将食物放入三明治中 - 它可能是芝士汉堡。

你可以做些什么来扭转这种局面:

(mainObject is PartsCar) ? (PartsCar)mainObject : mainObject 

相当于:

mainObject as PartsCar

然后使用 null coalescing operator 访问 mainObject 的转换结果(因为如果 as 失败,转换结果将为 null 而不是抛出异常)。

您尝试使用的通用方法 OfType<T> 是一种扩展方法,可以与 IEnumerable<T'> 类型的对象一起使用,我想这不是您的情况。

【讨论】:

    【解决方案2】:

    继承的思想是将超类中的共同点进行分组,而将其他特定细节留给子类。因此,如果一个属性,比如Price,被所有子类排除在外,那么它应该在超类中声明。

    但是,如果你仍然想这样使用它,那么你要找的是:

    int _price = ((PartsCar)mainObject).Price;
    

    但是,如果对象属于某个其他类,例如继承自 PartsParentPartsGift,但没有价格怎么办?然后它会崩溃。

    您几乎真的需要检查您的设计。

    顺便说一句,如果你想检查一个对象是否真的属于一个特定的类,那么你可以使用 is。

    int number = 1;
    object numberObject = number;
    bool isValid = numberObject is int; // true
    isValid = numberObject is string; // false
    

    【讨论】:

      【解决方案3】:

      您可以使用is 关键字检查类型和as 关键字转换为目标子类型,如下所示。

       if (mainObject is PartsCar)
       {
           var partscar = mainObject as PartsCar;
           // Do logic related to car parts
       }
       else if (mainObject is PartsBike)
       {
           var partsbike = mainObject as PartsBike;
           // Do logic related to bike parts.
       }
      

      【讨论】:

        【解决方案4】:

        如果您将代码中的不常见属性分成块,则可能:

        if (mainObject is PartsCar)
        {
            //Seprated code for PartsCar
            // WheelRadius...
            //Price...
        }
        else if (mainObject.GetType() == typeof(PartsBike))
        {
            //Seprated code for PartsBike 
            //Length
            //Weight
            //Price
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-19
          • 2013-03-24
          • 2019-04-02
          • 1970-01-01
          • 1970-01-01
          • 2019-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多