从父母到孩子的堕落c#

Off*_*nix -2 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
    }
Run Code Online (Sandbox Code Playgroud)

而这就是孩子.哪个有预先定义的变量.意味着它具有向下传播所需的所有信息.

    /// <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;
    }
Run Code Online (Sandbox Code Playgroud)

我试着用它来施展.

return Base.Blue as GlowStruct;
Run Code Online (Sandbox Code Playgroud)

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

不知道为什么你需要Base.Blue的定义看作是它的正数.我已经提到它是一个静态类.

public static Colour Blue = new Colour { R = 0, G = 0, B = 255, A = 255 };
Run Code Online (Sandbox Code Playgroud)

Zoh*_*led 6

A GlowStruct是a Colour,但这并不意味着a Colour是a GlowStruct.

如果Blue是一个类型Colour,你不能GlowStruct直接将其转换为直接因为GlowStruct需要Colour该类根本没有的附加信息- 这就是is操作符首先存在的原因- 允许您在确定实例的类型时只有一些基类或接口类型的引用.

更一般地说,派生类是它的基类的特定类型,但是类不是可能从它派生的任何类的类型 - 如果是这种情况,整个类型系统将变得多余,因为任何类型最终都源于此object,因此任何东西都可以被铸造成任何其他东西.

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

转换为c#:

class Animal {} 
class Mammal : Animal {}
class Felidae : Mammal {}
class Tiger : Felidae {}
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

Animal myTiger = new Tiger();

var mammal = myTiger as Mammal;
var felidae = myTiger as Felidae;
var tiger = myTiger as Tiger;
Run Code Online (Sandbox Code Playgroud)

但如果你尝试做这样的事情,你就是 -

Animal myTiger = new Animal();

var mammal = myTiger as Mammal; 
var felidae = myTiger as Felidae; 
var tiger = myTiger as Tiger; 
Run Code Online (Sandbox Code Playgroud)

那么mammal,felidae而且tiger都是null,因为动物可能是一只毒蛇,它不是哺乳动物,不是猫,而且不是老虎.

  • 不,它不包含`RWO`和`RWUO`字段,因为它是'Colour`类型.顺便说一句,公共领域是不好的做法 - 你应该使用属性.另一个BTW,在c#中,一个类型的公共成员的命名约定是CamelCase,这意味着每个单词的第一个字母应该大写,其他任何东西都应该是小写,即使在处理缩写和首字母缩略词时也是如此. (4认同)