所以我无法一生解决这个问题。而且我尝试了多种形式的转换。
这是父母。
/// <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 };
答案 0 :(得分:6)
GlowStruct
是Colour
,但这并不意味着Colour
是GlowStruct
。
如果Blue
是Colour
类型的,则您不能将其直接转换为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;
然后mammal
,felidae
和tiger
都将是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;
}
}
感谢您的回答。但是最后,他们实际上没有回答我的问题。