C # - Розніца паміж абстрактным, віртуальным і перавызначаным

c #

Сёння я хацеў бы паказаць вам розніцу паміж абстрактным, віртуальным і перавызначаным у C #.

Анатацыя

Дадаўшы абстракт да функцыі альбо класа, гэта азначае, што ён не рэальны і чакае рэалізацыі атрыманага класа. Давайце стварым абстрактны клас Animal:

грамадскі абстрактны клас Жывёлы
{
       пустая кара ()
       {
            Console.WriteLine ("Кара жывёл");
       }
 }

Паспрабуем стварыць асобнік класа Animal.

Жывёла жывёла = новая жывёла ();

Давайце запусцім яго, і кампілятар верне вам памылку, сказаўшы, што вы не можаце стварыць асобнік абстрактнага класа

Абстрактны клас нельга стварыць

Давайце створым клас, які наследуе Animal.

Сабака грамадскага класа: жывёла
{
   пустая кара ()
   {
      Console.WriteLine ("Сабачы брэх");
   }
}

Цяпер мы можам стварыць асобнік Animal, стварыўшы аб'ект Dog. Вядома, можна стварыць і асобнік тыпу Dog with Dog.

Жывёла жывёла = новая сабака ();
Сабака = новая сабака ();

Звычайна вы хацелі б выкарыстоўваць першы радок, таму што, калі вы ствараеце ўсё больш і больш класаў, якія ўспадкоўваюць Animal, усе яны па-ранейшаму тыпу Animal і могуць быць перададзены для функцыянавання з параметрам Animal type або калекцыяй з Animal type. Гэта называецца палімарфізмам.

Дык што адбываецца з кары функцыі? Для зменнай жывёлы, паколькі яе тып жывёл, будзе называцца карая функцыя, вызначаная ў класе Animal. Для зменнай сабакі, паколькі яе тып "Сабака", будзе называцца функцыя брэша, вызначаная ў класе Сабака.

Калі вы змесціце анатацыю на функцыі, вы не можаце рэалізаваць функцыю ў гэтым класе, і вам давядзецца рэалізаваць яе ў атрыманым класе. Давайце змянім клас жывёл і сабаку на наступны:

публічны абстрактны клас Жывёлы
{
     публічная абстрактная пустая кара ()
     {
          Console.WriteLine ("Кара жывёл");
     }
}
Сабака грамадскага класа: жывёла
{
      пустая кара ()
      {
           Console.WriteLine ("Сабачы брэх");
      }
}

Пры выкананні памылкі кампіляцыі былі вернутыя.

Абстрактная функцыя немагчыма рэалізаваць

Такім чынам, будзем выконваць інструкцыі ўкладальніка. Выдаліце ​​рэалізацыю кары ў класе Animal і запусціце. Што? Памылка кампіляцыі вяртаецца !! ??

Пераазначэнне

Так. Тут ідзе другое ключавое слова - пераазначэнне. Каб рэалізаваць функцыю бра ў класе Animal у класе Dog, вам трэба дадаць перавызначэнне функцыі кара, каб сказаць кампілятару, што вы рэалізуеце кара ў класе Animal, а не дадаваць іншую функцыю кары ў клас Dog (як тое, што мы рабілі раней). Пасля мадыфікацыі поспех кампіляцыі і вы можаце ўбачыць абодва радкі "Сабака".

Віртуальны

Давайце пагаворым пра віртуальны. Дадаўшы віртуальную функцыю, вы падаеце агульную логіку для функцыі, але даеце гнуткасць для пераўзыходу асноўнай функцыі. Вы можаце сказаць, што гэта практычна тое ж самае, калі не дадаваць віртуальную функцыю. Не, гэта не. Зараз я дэманструю вам розніцу паміж віртуальнай і не-віртуальнай функцыяй. Давайце змянім класы жывёл і сабак і асноўную функцыю:

Праграма грамадскага класа
{
    static void Main (string [] аргументы)
    {
        Жывёла жывёла = новая сабака ();
        Сабака = новая сабака ();
        animal.bark ();
        dog.bark ();
        animal.eat ();
        dog.eat ();
        Console.ReadLine ();
    }
}
Грамадскі грамадскі клас
{
    адкрытая віртуальная кара пустэчы ()
    {
        Console.WriteLine ("Кара жывёл");
    }
    публічная несапраўдная ежа ()
    {
        Console.WriteLine ("Жывёла есць");
    }
}
Сабака грамадскага класа: жывёла
{
    публічнае адмена несапраўднай кары ()
    {
        Console.WriteLine ("Сабачы брэх");
    }
    публічная несапраўдная ежа ()
    {
        Console.WriteLine ("Сабака есць");
    }
}

І вынік такі:

Пры перастаноўцы віртуальнай функцыі ў базавым класе абедзве функцыі ў базавым і атрыманым класах будуць аднолькавымі. Без віртуальнай і пераацэнкі вы будзеце мець 2 розныя функцыі - Animal.bark і Dog.bark.

Давайце яшчэ адзін эксперымент. Даданне наступных двух радкоў у галоўную функцыю:

Animal animal2 = новая Animal ();
animal2.bark ();

Цяпер, калі вы запусціце яго, вы атрымаеце логіку, вызначаную ў класе Animal. Такім чынам, падвядзем гэтыя 3 спалучэння дэкларацыі і вынікі:

Жывёла жывёла = новая сабака (); animal.bark (); // Выхад: брэх сабакі
Сабака = новы сабака (); dog.bark (); // Выхад: брэх сабакі
Animal animal2 = новая Animal (); animal2.bark (); // Выхад: Кара жывёл

Рэзюмэ:

Для рэферату, калі вы выкарыстоўваеце для класа, вы не можаце стварыць асобнік гэтага класа. Вы можаце стварыць асобнік дзіцячага класа, які яго ўспадкоўвае, альбо стварыць асобнік даччынага класа з тыпам базавага класа. Пры выкарыстанні функцыі вы не можаце рэалізаваць функцыю ў базавым класе, і яе трэба перавызначаць даччыным класам.

Для віртуальных функцый вы можаце рэалізаваць у базавым класе. Як толькі дзіцячы клас пераадолее яго, будзе толькі 1 версія гэтай функцыі.

Для пераазначэння, пераазначэнне можа быць ужыта толькі на пераацэнку, віртуальны альбо абстрактны.

Гэта сёння. Спадзяюся, вам спадабаецца артыкул і добра правесці дзень

Першапачаткова апублікавана на timmydinheing.com 18 красавіка 2018 года.