从父级降级到子级C#

时间:2019-01-23 13:13:20

标签: c# inheritance casting downcast

所以我无法一生解决这个问题。而且我尝试了多种形式的转换。

这是父母。

    /// <summary>
    /// Colour Parent
    /// </summary>
    public class Colour
    {

        #region Public Fields

        public float R;
        public float G;
        public float B;
        public float A;

        #endregion Public Fields
    }

这是孩子。其中具有预定义的变量。意味着它拥有所有需要下调的信息。

    /// <summary>
    /// Data strucutre extension of Base.Colour, Used for the variables stored inside the glow object in memory
    /// </summary>
    public class GlowStruct : Colour
    {
        public bool RWO  = true;
        public bool RWUO = true;
    }

我尝试使用它。

return Base.Blue as GlowStruct;

Base.Blue是Color类的静态成员。 使用“ is”返回false。

不确定为什么需要Base.Blue的定义,因为它只是数字。我已经提到这是一个静态类。

public static Colour Blue = new Colour { R = 0, G = 0, B = 255, A = 255 };

2 个答案:

答案 0 :(得分:6)

GlowStructColour,但这并不意味着ColourGlowStruct

如果BlueColour类型的,则您不能将其直接转换为GlowStruct,因为GlowStruct需要Colour类的附加信息根本没有-这就是is运算符首先存在的原因-当您仅具有某些基类或接口类型的引用时,允许您确定实例的类型。

更笼统地说,派生类是它的基类的一种特定类型,但是一个类不是从其派生的任何类的类型-如果是这种情况,整个类型系统将变为多余,因为任何类型最终都可以从object派生而来,因此任何内容都可以转换为其他任何内容。

再举一个例子-老虎是猫科动物(基本上是猫),所有的猫都是哺乳动物,所有的哺乳动物都是动物,但这并不意味着任何动物都是老虎,猫或甚至是哺乳动物。

翻译成c#:

class Animal {} 
class Mammal : Animal {}
class Felidae : Mammal {}
class Tiger : Felidae {}

您可以执行以下操作:

Animal myTiger = new Tiger();

var mammal = myTiger as Mammal;
var felidae = myTiger as Felidae;
var tiger = myTiger as Tiger;

但是,如果您尝试执行类似操作-

Animal myTiger = new Animal();

var mammal = myTiger as Mammal; 
var felidae = myTiger as Felidae; 
var tiger = myTiger as Tiger; 

然后mammalfelidaetiger都将是null,因为动物可能是毒蛇,不是哺乳动物,也不是猫,并且绝对不是老虎。

答案 1 :(得分:0)

经过研究后,我仍然坚信,对垂头丧气的忽视是愚蠢的。 向下转换有很多实际用途,创建我的颜色类是为了消除重复的代码,因为我将不得不创建一个全新的类,该类具有与颜色类相同的信息,并带有两个额外的布尔值以提供与GlowStruct相同的信息。这也意味着,如果我要在基础中编辑这些颜色类别,则这些更改也不会反映在glowStruct颜色中。最后,我向Glowstruct类添加了一个函数,以从父Color类继承信息。

根据所说的话,许多人试图解释为什么向下转换不起作用。这些原因之一是,没有办法规定应在仅子类中的空白字段中放置哪些信息。如果创建新的类对象,它将自动用空值填充这些字段。在这些情况下,c#也无法填充null似乎很可笑。

 public class GlowStruct : Colour
    {
        public bool RWO { get; } = true;
        public bool RWUO { get; } = true;

        public void Inherit(Colour Parent)
        {
            R = Parent.R;
            G = Parent.G;
            B = Parent.B;
            A = Parent.A;
        }
    }

感谢您的回答。但是最后,他们实际上没有回答我的问题。