Jaka jest różnica pomiędzy słowem new, a słowem override?


Najpierw należałoby wytłumaczyć czym jest słówko virtual. Zacznijmy więc ! 

Virtual - używa się go do metod i oznacza ono, że klasa pochodna dziedzicząca z klasy bazowej może przesłonić tą metodę. 

Override - przesłania metodę z klasy bazowej, która posiada metodę virutal. Zmienia funkcjonalność w klasie bazowej. W klasie pochodnej metoda ta posiada taką samą nazwę, parametry oraz wartość zwrotną. Przykładowe metody na których można użyć override to: 

  • ToString()
  • Equals()
  • GetHashCode()

New - zakrywa oryginalną metodę, ta nie musi być virtual. Dostarcza nową funkcjonalność, powinno się używać w bardzo koniecznych sytuacjach. Kiedy zakryjemy metodę mamy wciąż dostęp do oryginalnej metody poprzez rzutowanie na klasę bazową. 


Przykładowy kod, aby lepiej zrozumieć to zagadnienie: 

 public interface IUndoable
    {
        void Undo();
    }
    public class Textbox : IUndoable
    {
         public virtual void Undo() => Console.WriteLine("TextBox.Undo");
    }
    public class RichTextBox : Textbox
    {
        public override void Undo() => Console.WriteLine("RichTextBox.Undo");
    }
    public class ExtraTextBox : Textbox
    {
        public new void Undo() => Console.WriteLine("ExtraTextBox.Undo");
    }

Wyrażenie lambda ( => ) działa w tym wypadku jak return.


Wywołując w Main: 

 RichTextBox richText = new RichTextBox();
            richText.Undo();  //RichTextBox.Undo
            ((Textbox)richText).Undo(); //to samo wypisze co wyżej
            ((IUndoable)richText).Undo(); //tutaj też

            Console.WriteLine();

 ExtraTextBox extra = new ExtraTextBox();
            extra.Undo();  //ExtraTextBox.Undo
            ((Textbox)extra).Undo(); //TextBox.Undo
            ((IUndoable)extra).Undo();  //TextBox.Undo

Otrzymamy: 

RichTextBox.Undo
RichTextBox.Undo
RichTextBox.Undo

ExtraTextBox.Undo
TextBox.Undo
TextBox.Undo


© 2024 - SkillsTest.pl | | Regulamin | Polityka Prywatnosci