Przeciążanie i zastępowanie


104

Jaka jest różnica między przeciążaniem a zastępowaniem.


2
@james: czy przynajmniej spróbowałeś google?
Mitch Wheat

Zgaduję, że tego nie dostaniesz.
Jon B


1
@james, przypuszczam, że intuicyjnie zrozumieliście te pojęcia, nie znając terminów. Zgaduję, że jesteś samoukiem. Powinieneś prawdopodobnie wziąć książkę C # dla początkujących, nie po to, aby się uczyć, ale aby wzmocnić to, co już wiesz. To otępiające, ale bardzo pomoże w wywiadach technicznych.
Michael Meadows,

można przeczytać więcej na ten link: intquesans.blogspot.com/2011/05/...

Odpowiedzi:


220

Przeciążenie

Przeciążanie ma miejsce, gdy masz wiele metod w tym samym zakresie, z tą samą nazwą, ale różnymi podpisami.

//Overloading
public class test
{
    public void getStuff(int id)
    {}
    public void getStuff(string name)
    {}
}

Nadrzędny

Przesłanianie to zasada, która umożliwia zmianę funkcjonalności metody w klasie podrzędnej.

//Overriding
public class test
{
        public virtual void getStuff(int id)
        {
            //Get stuff default location
        }
}

public class test2 : test
{
        public override void getStuff(int id)
        {
            //base.getStuff(id);
            //or - Get stuff new location
        }
}

1
Uwielbiam tę odpowiedź @cgreeno .. Dzięki
Ferrakkem Bhuiyan

1
@cgreeno myślę tęsknisz voidza getStuffwtest2
Mahdiego

2
wystarczy wspomnieć, że metoda klasy bazowej musi być oznaczona jako wirtualna, aby przesłonić, w przeciwnym razie wystąpi błąd kompilacji.
Alex Stephens

Hej, to może być stare, ale wciąż mam pytanie. Czy przeciążenie sprawia, że ​​jest on dostępny, aby mieć większą funkcjonalność dzięki „jednej” metodzie? Tak jak mogę to zrobić: getStuff(2, "Hello world!");czy mogę to zrobić getStuff("Myname", "Mysurname", "Hello World!");? Czy ktoś może potwierdzić, że to sposób na zrobienie tego?
Sj03rs

Myślę, że przykład Overriding faktycznie to Overwriting, override jest wtedy, gdy metoda superklasy zostanie zastąpiona przypadkowo lub jeśli zamierzasz to zrobić za pomocą nowego słowa kluczowego w obu przypadkach, zastąp lub nadpisz, behaivor jest inny, gdy deklarujesz Parent p = new Dziecko(); p.Method (); ... może się mylę i jest to po prostu inny sposób na zrobienie prawie tego samego. Czy ktoś może to wytłumaczyć lepiej niż ja?
Cristina Carrasco

35

Proste definicje przeciążania i zastępowania

Przeciążanie (polimorfizm czasu kompilacji) :: Funkcje o tej samej nazwie i różnych parametrach

public class A
{
    public void print(int x, int y)
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public void print(float x, float y)
    {
        Console.WriteLine("Overload child method");
    }
}

Przesłanianie (polimorfizm czasu wykonywania) :: Funkcje w klasie rozszerzonej o takiej samej nazwie i takich samych parametrach jak w klasie bazowej, ale z różnymi zachowaniami.

public class A
{
    public virtual void print()
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public override void print()
    {
        Console.WriteLine("Overriding child method");
    }
}

Być może chciałbyś dodać, że nadrzędna koncepcja dotyczy relacji klasa nadrzędna-podklasa.
Freakyuser

10

Chcę podzielić się przykładem, który miał dla mnie dużo sensu, kiedy się uczyłem:

To tylko przykład, który nie obejmuje metody wirtualnej ani klasy bazowej. Żeby dać wskazówkę dotyczącą głównego pomysłu.

Załóżmy, że istnieje myjnia samochodowa, która ma funkcję „Myj” i akceptuje jako typ Samochód.

Pobiera dane wejściowe samochodu i myje samochód.

public void Wash(Car anyCar){
       //wash the car
}

Przeładujmy funkcję Wash ()

Przeciążenie:

public void Wash(Truck anyTruck){
   //wash the Truck  
}

Funkcja mycia wcześniej tylko myła samochód, ale teraz jest przeciążona, aby umyć również ciężarówkę.

  • Jeśli podany obiekt wejściowy to Car, wykona Wash (Car anyCar)
  • Jeśli podany obiekt wejściowy to Ciężarówka, wykona Mycie (Ciężarówka anyTruck)

Zastąpmy funkcję Wash ()

Nadrzędny:

public override void Wash(Car anyCar){
   //check if the car has already cleaned
   if(anyCar.Clean){ 
       //wax the car
   }
   else{
       //wash the car
       //dry the car
       //wax the car
   }     
}

Funkcja mycia ma teraz warunek, aby sprawdzić, czy samochód jest już czysty i nie trzeba go ponownie myć.

  • Jeśli samochód jest czysty, po prostu go woskuj.

  • Jeśli nie jest czysty, najpierw umyj samochód, następnie wysusz go, a następnie woskuj

.

Więc funkcjonalność została zastąpiona przez dodanie nowej funkcjonalności lub zrobienie czegoś zupełnie innego.


1
To musi być odpowiedź. Zagłosowano +
Jack


4

Jak powiedział Michael:

  • Przeciążenie = wiele podpisów metod, ta sama nazwa metody
  • Przesłanianie = ta sama sygnatura metody (deklarowana wirtualna), zaimplementowana w podklasach

i

  • Shadowing = Jeśli traktowane jako DerivedClass używa metody pochodnej, jeśli jako BaseClass używa metody bazowej.

3

Posiadanie więcej niż jednej metody / konstruktora o tej samej nazwie, ale różnych parametrach nazywa się przeciążaniem. To jest zdarzenie czasu kompilacji.

Class Addition 
{
   int add(int a, int b) 
   {
     return a+b;
   }
   int add(int a, int b, int c)
   {
     return a+b+c;
   }

   public static main (String[] args) 
   {
     Addition addNum = new Addition();
     System.out.println(addNum.add(1,2));
     System.out.println(addNum.add(1,2,3));
   }
}

O / p:

3
6

Zastępowanie jest zdarzeniem w czasie wykonywania, co oznacza, że ​​na podstawie kodu dane wyjściowe zmieniają się w czasie wykonywania.

class Car
{
    public int topSpeed() 
    {
        return 200;
    }
}
class Ferrari extends Car
{
    public int topSpeed()
    {
        return 400;
    }
    public static void main(String args[])
    {
        Car car = new Ferrari();
        int num= car.topSpeed();
        System.out.println("Top speed for this car is: "+num);
    }
}

Zauważ, że w obu klasach istnieje wspólna metoda topSpeed ​​(). Ponieważ utworzyliśmy instancję Ferrari, otrzymujemy inny wynik.

O / p:

Top speed for this car is: 400

2

w C # nie ma Java jak ukryte przesłonięcie, bez przesłaniania słowa kluczowego w metodzie przesłaniania! zobacz te implementacje C #:

wariant 1 bez nadpisania : wynik to 200

    class Car {
        public int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

wariant 2 ze słowem kluczowym override : wynik to 400

    class Car {
        public virtual int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public override int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

słowo kluczowe wirtualne w klasie Car jest przeciwne dla finału w Javie, oznacza nie ostateczne , możesz nadpisać lub zaimplementować, jeśli Car był abstrakcyjny


1

shadowing = zachowuje dwie definicje w klasie pochodnej iw celu zaprojektowania definicji klasy bazowej przesłania (ukrywa) definicję klasy pochodnej i odwrotnie.


1

Kolejna kwestia do dodania.

Przeciążanie więcej niż jednej metody o tej samej nazwie. Ten sam lub inny typ zwrotu. Różne liczby parametrów lub inny typ parametrów. W tej samej klasie lub klasie pochodnej.

int Add (int num1, int num2) int Add (int num1, int num2, int num3) double Add (int num1, int num2) double Add (double num1, double num2)

Może być możliwe w tej samej klasie lub klasie pochodnej. Generalnie woli w tej samej klasie. Np. Console.WriteLine () ma 19 przeciążonych metod.

Potrafi przeciążać konstruktory klas, metody.

Można uznać za polimorfizm czasu kompilacji (statyczny / wczesne wiązanie).

==================================================== ==================================================== =

Zastępowanie nie może być możliwe w tej samej klasie. Może przesłonić metody klas, właściwości, indeksatory, zdarzenia.

Ma pewne ograniczenia, takie jak Przesłonięta metoda podstawowa musi być wirtualna, abstrakcyjna lub nadpisana. Nie można używać nowych, statycznych ani wirtualnych modyfikatorów do modyfikowania metody zastępowania.

Można rozważyć jako polimorfizm w czasie wykonywania (dynamiczny / późne wiązanie).

Pomaga w wersjonowaniu http://msdn.microsoft.com/en-us/library/6fawty39.aspx

==================================================== ==================================================== =

Przydatne linki

http://msdn.microsoft.com/en-us/library/ms173152.aspx Polimorfizm czasu kompilacji a polimorfizm czasu wykonywania


Dobry, z potrzebnymi szczegółami.
user3885927

1

Przeciążanie jest częścią statycznego polimorfizmu i służy do implementacji innej metody o tej samej nazwie, ale różnych sygnaturach. Przesłanianie służy do zakończenia niepełnej metody. Moim zdaniem nie ma porównania między tymi dwoma pojęciami, jedyne, co jest podobne, to to, że oba mają to samo słownictwo, które się skończyło.


Kapitan tutaj: Przeciążenie metody daje wiele podpisów różnych metod o tej samej nazwie. Zastępowanie powoduje ukrycie odziedziczonego elementu członkowskiego z klas lub interfejsów. odlatuje
SparK

1
Zastąpienie @SparK nie powoduje ukrycia członka. Można też zastąpić lub ukryć odziedziczony członka. Te dwie opcje wykluczają się wzajemnie.
Servy

@Servy, zły dobór słów, miałem na myśli „substytuty”.
SparK

0

Przeciążanie metod i Nadpisywanie metod to dwie różne koncepcje. Przeciążanie metod ma tę samą nazwę metody, ale różne podpisy. Zastępowanie metody polega na zmianie domyślnej implementacji metody klasy bazowej w klasie pochodnej. Poniżej znajdziesz 2 doskonałe samouczki wideo wyjaśniające te pojęcia.

Metoda przesłaniająca ukrywanie Vs

Przeciążanie metod


0

Przeciążanie to koncepcja, w której masz te same sygnatury lub metody o tej samej nazwie, ale z różnymi parametrami i nadpisywaniem, mamy metody o tej samej nazwie z różnymi parametrami, które również mają dziedziczenie, czyli nadpisywanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.