@BernadetteWolowitz
C# developer

Как правильно перекрыть или скрыть существующий родительский метод?

Имеется базовый абстрактный класс (менять его нельзя), в котором есть метод GetDescription()
public abstract class GrandFather
    {
        public string Description = "Grandfather";
        public string GetDescription()
        {
            return Description;
        }
        public abstract double GetAge();
    }


От него наследуется другой абстрактный класс, в котором я пытаюсь перекрыть исходный метод GetDescription()
public abstract class Son: GrandFather
    {
        public new abstract string GetDescription();
    }


От него наследуется третий класс, в котором должна выполниться собственная реализация метода GetDescription()
public class GrandSon: Son
    {
        public override string GetDescription()
        {
            return "Grandson";         
        }
        public override double GetAge()
        {
            return 10;
        }
    }


Выполняю код
GrandFather gf = new GrandSon();
            Console.WriteLine(gf.GetDescription());
            Console.WriteLine(gf.GetAge());


Выводится: GrandFather, 10. Т.е. метод GetAge() выполняется в GrandSon, а вот метод GetDescription() выполняется из GrandFather.
Как правильно перекрыть метод GetDescription(), чтобы он выполнялся из GrandSon?

Дополнение: это я пытаюсь перевести на C# пример, написанный на Java, из книги "Паттерны проектирования" Фрименов. Пример относится к паттерну Декоратор и в условиях задачи класс GrandFather (Beverage в книге) взят из API заказчика и его нельзя менять.
Решение с Console.WriteLine(((Grandson)gf).GetDescription()) локально подходит, но для всей задачи мне нужно именно перекрыть метод GetDescription() в Son.
  • Вопрос задан
  • 1012 просмотров
Решения вопроса 2
xkeirainx
@xkeirainx
Фулстэк энтерпрайз разной степени кровавости
При наследовании сначала создаются методы базового типа, а потом дополняются методами наследника. Вы инстанциируете класс GrandFather, что, кстати, странно. Отсюда получается два варианта:
GrandFather gf = new GrandSon();
            Console.WriteLine(((GrandSon) gf).GetDescription());

либо
GrandSon gf = new GrandSon();
            Console.WriteLine(gf.GetDescription());
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
public abstract class GrandFather
{
public string Description = "Grandfather";
public virtual string GetDescription()
{
return Description;
}
public abstract double GetAge();
}

Если метод помечен как virtual, то вызываемая реализация берется из типа объекта, а не из типа указателя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Попробуй приведение типов использовать, когда экземпляр GrandSon создаешь.
GrandFather gf = (GrandSon) new GrandSon();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы