Не выполняется конструктор при upcast C#

Создайте класс Printer, там создайте метод void Print(string value), который выводит на экран значение аргумента. Реализуйте возможность того, чтобы в случае наследования от данного класса других классов, и вызове соответствующего метода их экземпляра, строки, переданные в качестве аргументов методов, выводились разными цветами. Обязательно используйте приведение типов!

Вот мой код :

namespace Task1
{
    class Printer
    {
        public void Print(string value)
        {
            Console.WriteLine(value);
        }
    }

    class Company : Printer
    {
        public Company()
        {
            Console.ForegroundColor = ConsoleColor.Green;
        }

    }

    class Position : Company
    {
        public Position()
        {
            Console.ForegroundColor = ConsoleColor.Blue;
        }
    }

    class NamePerson : Position
    {
        public NamePerson()
        {
            Console.ForegroundColor = ConsoleColor.Red;
        }

    }

    class Program
    {
        static void Main(string[] args)
        {

            NamePerson name = new NamePerson();
            name.Print("Elon");
            Position company = (Position)name;
            company.Print("Tesla, SpaceX");
            Company position = (Company)company;
            position.Print("Head");
        }
    }
}

Проблема: когда делаю upcast то не меняется цвет текста выводящийся на консоль как указано в конструкторе, как сделать так, чтобы когда делал upcast то и менялся цвет текста? Думал через конструктор, но не работает.


Ответы (1 шт):

Автор решения: aepot

Конструктор выполняется при создании экземпляра определенного типа, к кастам он никакого отношения не имеет.

Ваше задание очень простое

namespace Task1
{
    class Printer
    {
        public virtual void Print(string value)
        {
            Console.WriteLine(value);
        }
    }

    class Company : Printer
    {
        public override void Print(string value)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            base.Print(value);
        }
    }

    class Position : Printer
    {
        public override void Print(string value)
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            base.Print(value);
        }
    }

    class NamePerson : Printer
    {
        public override void Print(string value)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            base.Print(value);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            Printer name = new NamePerson();
            name.Print("Elon");
            Printer company = new Company();
            company.Print("Tesla, SpaceX");
            Printer position = new Position();
            position.Print("Head");
        }
    }
}

Ну или так можно

class Printer
{
    protected ConsoleColor color = Console.ForegroundColor;

    public void Print(string value)
    {
        Console.ForegroundColor = color;
        Console.WriteLine(value);
    }
}

class Company : Printer
{
    public Company()
    {
        color = ConsoleColor.Green;
    }
}

class Position : Printer
{
    public Position()
    {
        color = ConsoleColor.Blue;
    }
}

class NamePerson : Printer
{
    public NamePerson()
    {
        color = ConsoleColor.Red;
    }
}
→ Ссылка