leshqow
@leshqow
-l-

Переопределение метода через override. Почему не срабатывает?

Код родителя:
public virtual int Perimeter()
        {
            return SideA + SideB + SideC;
        }

Код наследника:
public override int Perimeter()
        {
            return SideA-SideB-SideC;
        }


Вызов:

Treangle obj = new Treangle();
Console.WriteLine(obj.Perimeter())


Создаю объект типа Treangle, т.е. родителя. В наследнике Rectangular я его переопределил через override, а ведь если я не ошибаюсь переопределяет метод и для родителя тоже. В итоге используется код метода родителя, а не тот который переопределен. В чем я ошибаюсь ?
  • Вопрос задан
  • 472 просмотра
Решения вопроса 1
GavriKos
@GavriKos
а ведь если я не ошибаюсь переопределяет метод и для родителя тоже.

Если создан объект как родитель - то и метод будет родителя. Переопределение работает только в том случае, если объект был действительно создан как наследник (причем неважно в какой тип данных его потом положили - главное как сконструировали)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Namynnuz
Подобного рода наследования приводят к очень хрупкому коду. Именно поэтому ОПП не является моделированием реальности, иначе потом поддерживать эти наркоманские зависимости будет невозможно и любые изменения на любом уровне будут приводить к тому, что где-то что-то постоянно будет отваливаться и чиня в одном месте, мы будем ломать в другом.
Кроме того, что тебе стоит прочитать хоть какую-то книженцию по шарпею, следует так же изучить принципы SOLID.
Ответ написан
Комментировать
По ссылке хорошо расписано, вот основной пример про разницу между модификаторами override и new:

using System;  
using System.Text;  

namespace OverrideAndNew  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            BaseClass bc = new BaseClass();  
            DerivedClass dc = new DerivedClass();  
            BaseClass bcdc = new DerivedClass();  

            // The following two calls do what you would expect. They call  
            // the methods that are defined in BaseClass.  
            bc.Method1();  
            bc.Method2();  
            // Output:  
            // Base - Method1  
            // Base - Method2  

            // The following two calls do what you would expect. They call  
            // the methods that are defined in DerivedClass.  
            dc.Method1();  
            dc.Method2();  
            // Output:  
            // Derived - Method1  
            // Derived - Method2  

            // The following two calls produce different results, depending   
            // on whether override (Method1) or new (Method2) is used.  
            bcdc.Method1();  
            bcdc.Method2();  
            // Output:  
            // Derived - Method1  
            // Base - Method2  
        }  
    }  

    class BaseClass  
    {  
        public virtual void Method1()  
        {  
            Console.WriteLine("Base - Method1");  
        }  

        public virtual void Method2()  
        {  
            Console.WriteLine("Base - Method2");  
        }  
    }  

    class DerivedClass : BaseClass  
    {  
        public override void Method1()  
        {  
            Console.WriteLine("Derived - Method1");  
        }  

        public new void Method2()  
        {  
            Console.WriteLine("Derived - Method2");  
        }  
    }  
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы