Даункинг от родителя к ребенку - PullRequest
0 голосов
/ 23 января 2019

Так что я не могу понять это ради моей жизни.И я попробовал кастинг в нескольких формах.

Это родитель.

    /// <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» возвращает ложь.

Не уверен, зачем вам нужно определение Base.Blue, видя только его числа.Я уже упоминал, что это статический класс.

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

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я до сих пор твердо верю после проведения исследований, что пренебрежение унынием является глупым. У downcasting есть много практических применений. Мои цветовые классы были созданы для устранения повторяющегося кода, так как мне нужно было бы создать новый класс с той же информацией, что и у цветового класса, с двумя дополнительными логическими значениями, чтобы дать ту же информацию, что и GlowStruct. Это также означает, что если бы я редактировал эти цветовые классы в базе, эти изменения также не были бы отражены в цветах glowStruct. В конце я добавил функцию в класс Glowstruct для наследования информации от родительского класса Color.

Из того, что было сказано, многие пытались объяснить, почему уныние не работает. Одна из этих причин заключалась в том, что невозможно определить, какую информацию следует помещать в пустые поля, которые есть только в дочернем классе. Если вы создаете новый объект класса, он автоматически заполняет эти поля нулем. И просто кажется глупым, что c # не может заполнить нулем в таких ситуациях.

 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;
        }
    }

Спасибо за ответы. Но в итоге они не ответили на мой вопрос.

0 голосов
/ 23 января 2019

A GlowStruct - это Colour, но это не значит, что Colour - это GlowStruct.

Если Blue имеет тип Colour, чем вы можетене приводите его к GlowStruct напрямую, потому что GlowStruct требует дополнительной информации, которой у класса Colour просто нет - вот почему оператор is существует в первую очередь - чтобы вы могли определить типэкземпляр, когда у вас есть только ссылка на некоторый базовый класс или тип интерфейса.

В более общих чертах, производный класс - это особый тип своего базового класса, но класс не является типом любого изклассы, которые могут быть производными от него - если бы это было так, вся система типов стала бы избыточной, поскольку любой тип в конечном счете был бы производным от object, и поэтому все можно было привести к чему-либо еще.

И в качестве другого примера- тигр - это разновидность кошачьих (в основном кошек), и все кошки - млекопитающие, а все млекопитающие - животные, но это не значит, что любое животное является тигром, кошкой или даже млекопитающим.

Transс учетом #:

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, поскольку животное может быть гадюкой, а не млекопитающим, не кошкой и демонстративно не тигром.

...