Вопрос об upcast в c#

369
30 августа 2017, 13:18

Есть код:

class Parent
{
    public virtual void Say()
    {
        Console.WriteLine("Parent");
    }
}
class Tort : Parent
{
    public override void Say()
    {
        Console.WriteLine("tort");
    }
}
class Karamelka : Parent
{
    public override void Say()
    {
        Console.WriteLine("karamelka");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Parent tort = new Tort();
        tort.Say();
        ((Karamelka)tort).Say();
    }
}

Как мне превратить объект Tort в Karamelka или в Parent, чтобы он использовал другую реализацию метода Say()? Сейчас вызывается исключение InvalidCastException

Answer 1

Привести тип Tort к типу Karamelka не получится, так как класс Tort не является наследником класса Karamelka.

Приведение Tort к Parent в вашем коде уже присутствует:

Parent tort = new Tort();

Но использовать реализацию метода Say(), отличную от той, что в классе Tort не получится. Но можно внести следующие изменения: в классе Tort исправьте public override void Say() на public new void Say().

Работать это будет так:

Tort tort = new Tort();
tort.Say(); // "tort"
((Parent)tort).Say(); // "Parent"
Answer 2

Если хотите правильно реализовать с практический точки зрение, тогда нужна реализовать паттерн стратегия в этом ситуации.
В этом ситуации наследование не улучшает а наоборот уменьшает сопровождаемость.
примерно должны писать вот так:

  class Dessert
    {
        public virtual void Say(Action<string> predicate,string info)
        {
            predicate(info);
        }
    }

    class Program
    {
        static void DefaultSay(string info)
        {
            Console.WriteLine(info);
        }
        static void Main(string[] args)
        {
            Dessert tort = new Dessert();
            tort.Say(DefaultSay, "tort");
            Dessert karamel = new Dessert();
            karamel.Say(DefaultSay, "karamel");
            Console.ReadLine();
        }
    }
READ ALSO
Почему при сложении byte не переполняется?

Почему при сложении byte не переполняется?

Есть вот такой очень простой код

315
Как устроено iocp в System.Net.Socket?

Как устроено iocp в System.Net.Socket?

Как IOCP устроено в нативе - понятноСоздается IO порт, к нему привязываются сокеты

349
Извлечь данные пользователя

Извлечь данные пользователя

Создаю программу "Банкомат"Возник вопрос - как сделать чтобы пользователь ввел свой ид, и сразу показало его счет и фио класс банкомат

447