Переопределение функций без виртуального и переопределения

1

У меня только один основной вопрос:

public class virtualTest
   {
       public virtual void vTest()
       {
           Console.WriteLine("Base Class");
       }
   }

   public class derivedVirtualTest : virtualTest
   {
       public override void  vTest()
        {
            Console.WriteLine("Derived Class");
        }
   }

Здесь я использовал функцию переопределения с функцией vTest()

Но если i:

public class virtualTest
   {
       public void vTest()
       {
           Console.WriteLine("Base Class");
       }
   }

   public class derivedVirtualTest : virtualTest
   {
       public void  vTest()
        {
            Console.WriteLine("Derived Class");
        }
   }

удаляет виртуальные и переопределяет ключевые слова из соответствующих мест, а затем работает код.

Как это может быть возможным?

Или тогда, что использование переопределения и виртуального (целая функция переопределения), если код работает нормально без виртуального и переопределить???

Редактировать:

Мой метод, через который я звоню выше классов

 static void Main(string[] args)
        {



            derivedVirtualTest objderivedVirtualTest = new derivedVirtualTest();
            objderivedVirtualTest.vTest();

            virtualTest objvirtualTest = new virtualTest();
            objvirtualTest.vTest();

            Console.ReadLine();


        }
  • 0
    Вы сказали, что этот код работает, но вы никогда не показывали, как вы его тестировали. Отправьте этот код также. Это самая важная часть.
  • 0
    @SriramSakthivel только что опубликовал. Пожалуйста, посмотрите на это
Показать ещё 2 комментария
Теги:

3 ответа

3
Лучший ответ

Как пояснил qwr, основное различие в терминах ООП - полиморфизм. Это означает, что если вы получаете доступ к классу, который переопределяет базовый элемент с помощью ссылки базового типа, вызов, который вы выполняете для элемента с возможностью переопределения, перенаправляется на переопределение.

В случае класса, который скрывает/скрывает базовый элемент, вызов не перенаправляется, а метод базового класса выполняется.

Итак, учитывая:

class Base
{
    public virtual void OverrideMe()
    {
        Console.WriteLine("I'm the base");
    }
}

class Derived : Base
{
    public override void OverrideMe()
    {
        Console.WriteLine("I'm derived");
    }
}

class Shadowing : Base
{
    public void OverrideMe()
    {
        Console.WriteLine("I'm shadowing");
    }
}

И используя их таким образом:

var instances = new Base[] {new Base(), new Derived(), new Shadowing()};

foreach (var instance in instances)
{
    instance.OverrideMe();
}

Будет производить:

Я базовый

Я получил

Я базовый

Дополнительная разница заключается в том, что в случае переопределения вы можете развить свой базовый класс, например, изменить подпись базового элемента или полностью удалить его, не изменяя его. Что в некоторых случаях может удовлетворить потребности точно, а в некоторых - не так много.

В случае переопределения вы также должны изменить подпись переопределяющего элемента, иначе ваш код не сможет скомпилироваться.

  • 0
    предположим, что в приведенном выше примере есть только два класса: Base и Shadowing, и OverrideMe не объявлен как виртуальный в Base. Тогда это называется Shaddowing ????
  • 1
    Да. И производный метод никогда не будет вызван, если вы ссылаетесь на производный класс через базовый тип. Кроме того, вы можете даже заставить метод скрытия возвращать некоторое значение (не void ), и компилятор не выдаст ошибку, а только предупредит, что не использует ключевое слово new .
Показать ещё 1 комментарий
5

Сначала вы можете добиться полиморфизма. На секунду вы не можете.

Первый называется overriding, второй называется hidding или shadowing (Vb.Net)

И об этом много вопросов.

переопределить и скрывать вопросы

Различия между тенью и переопределением MSDN

  • 0
    Но здесь записка написана так: Обратите внимание, что в C # вы не можете переопределить не виртуальный или статический метод. Но я переопределил метод без виртуального
  • 0
    что вы подразумеваете под секундой, вы не можете сделать полиморфизм? @qwr
Показать ещё 2 комментария
1

Во втором примере, возможно, вы проверите свой код следующим образом:

derivedVirtualTest deviTest = new derivedVirtualTest();
deviTest.vTest();  //Result "Derived Class"

Попробуйте это, и вы увидите, что функция еще не была переопределена:

virtualTest deviTest = new derivedVirtualTest();
deviTest.vTest();  //Result "Base Class"
//This will result "Dervived class" in the first one

Ещё вопросы

Сообщество Overcoder
Наверх
Меню