Есть код:
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
Привести тип 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"
Если хотите правильно реализовать с практический точки зрение, тогда нужна реализовать паттерн стратегия в этом ситуации.
В этом ситуации наследование не улучшает а наоборот уменьшает сопровождаемость.
примерно должны писать вот так:
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();
}
}
Продвижение своими сайтами как стратегия роста и независимости