Surcharge et dépassement


104

Quelle est la différence entre une surcharge et un dépassement.


2
@james: avez-vous au moins essayé google ??
Mitch Wheat

Je suppose que vous n'obtiendrez pas celui-ci.
Jon B

james - probablement pas et je me sens assez stupide de ne pas être en mesure d'expliquer un concept simple

1
@james, je suppose que vous avez intuité ces concepts sans en connaître les termes. Je vais deviner que vous êtes autodidacte. Vous devriez probablement vous procurer un livre de niveau C # débutant, non pas pour apprendre mais pour renforcer ce que vous savez déjà. C'est stupéfiant, mais cela aidera énormément dans les interviews techniques.
Michael Meadows

vous pouvez en savoir plus sur ce lien: intquesans.blogspot.com/2011/05/…

Réponses:


219

Surcharge

La surcharge se produit lorsque vous avez plusieurs méthodes dans la même portée, avec le même nom mais des signatures différentes.

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

Primordial

Le remplacement est un principe qui vous permet de modifier la fonctionnalité d'une méthode dans une classe enfant.

//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
j'aime cette réponse @cgreeno ..Merci
Ferrakkem Bhuiyan

1
@cgreeno je pense que vous manquez voidpour getStuffdanstest2
Mahdi

2
juste pour mentionner que la méthode de la classe de base doit être marquée comme virtuelle pour la remplacer, sinon vous obtiendrez une erreur de compilation.
Alex Stephens

Hé, c'est peut-être vieux mais j'ai encore une question à ce sujet. La surcharge permet-elle d'avoir plus de fonctionnalités avec une méthode «une»? Comme je peux le faire: getStuff(2, "Hello world!");ou je peux le faire getStuff("Myname", "Mysurname", "Hello World!");? N'importe qui peut confirmer que c'est la façon de le faire?
Sj03rs

Je pense que l'exemple de remplacement est en fait l'écrasement, le remplacement se produit lorsque votre méthode de super-classe est remplacée accidentellement ou si vous voulez le faire en utilisant le nouveau mot-clé dans les deux cas, remplacer ou écraser, le comportement est différent lorsque vous déclarez Parent p = nouveau Enfant(); p.Méthode (); ... peut-être que je me trompe et c'est juste une autre façon de faire presque la même chose. Quelqu'un peut-il l'expliquer mieux que moi?
Cristina Carrasco le

35

Définitions simples pour la surcharge et le remplacement

Overloading (Compile Time Polymorphism) :: Fonctions avec le même nom et des paramètres différents

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");
    }
}

Overriding (Run Time Polymorphism) :: Fonctions dans la classe étendue avec le même nom et les mêmes paramètres que dans la classe de base, mais avec des comportements différents.

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");
    }
}

Vous aimeriez peut-être ajouter que le concept primordial s'applique à la relation classe-sous-classe parente.
Freakyuser

10

Je veux partager un exemple qui a eu beaucoup de sens pour moi lorsque j'apprenais:

Ceci est juste un exemple qui n'inclut pas la méthode virtuelle ou la classe de base. Juste pour donner une idée de l'idée principale.

Disons qu'il y a une machine à laver de véhicule et qu'elle a une fonction appelée «lavage» et accepte la voiture comme type.

Obtient l'entrée de la voiture et lave la voiture.

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

Surchargeons la fonction Wash ()

Surcharge:

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

La fonction de lavage ne lavait qu'une voiture auparavant, mais elle est maintenant surchargée pour laver un camion également.

  • Si l'objet d'entrée fourni est une voiture, il exécutera Wash (Car anyCar)
  • Si l'objet d'entrée fourni est un camion, il exécutera Wash (Truck anyTruck)

Remplaçons la fonction Wash ()

Primordial:

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
   }     
}

La fonction de lavage a maintenant une condition pour vérifier si la voiture est déjà propre et n'a pas besoin d'être lavée à nouveau.

  • Si la voiture est propre, cirez-la simplement.

  • Si ce n'est pas propre, lavez d'abord la voiture, puis séchez-la puis cirez-la

.

Ainsi, la fonctionnalité a été remplacée en ajoutant une nouvelle fonctionnalité ou en faisant quelque chose de totalement différent.


1
Cela doit être la réponse. A voté +
Jack le


4

Comme Michael l'a dit:

  • Surcharge = plusieurs signatures de méthode, même nom de méthode
  • Overriding = Même signature de méthode (déclarée virtuelle), implémentée dans les sous-classes

et

  • Shadowing = Si traité comme DerivedClass, il utilise une méthode dérivée, si comme BaseClass, il utilise la méthode de base.

3

Avoir plus d'une méthode / constructeur avec le même nom mais des paramètres différents est appelé surcharge. Il s'agit d'un événement de compilation.

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

Le remplacement est un événement d'exécution, ce qui signifie qu'en fonction de votre code, la sortie change au moment de l'exécution.

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);
    }
}

Notez qu'il existe une méthode commune dans les deux classes topSpeed ​​(). Depuis que nous avons instancié une Ferrari, nous obtenons un résultat différent.

O / p:

Top speed for this car is: 400

2

en C #, il n'y a pas de remplacement caché comme Java , sans remplacement de mot clé sur la méthode de remplacement ! voir ces implémentations C #:

variante 1 sans remplacement : le résultat est 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();
    }

variante 2 avec mot-clé override : le résultat est 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();
    }

Le mot-clé virtuel sur la classe de voiture est opposé pour final sur Java, signifie non final , vous pouvez remplacer ou implémenter si Car était abstrait


1

shadowing = maintient deux définitions au niveau de la classe dérivée et afin de projeter la définition de la classe de base, il occulte (masque) la définition de la classe dérivée et vice versa.


1

Un autre point à ajouter.

Surcharge plus d'une méthode avec le même nom. Type de retour identique ou différent. Différents pas de paramètres ou différents types de paramètres. Dans la même classe ou classe dérivée.

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)

Peut être possible dans la même classe ou classe dérivée. Préfère généralement dans la même classe. Par exemple, Console.WriteLine () a 19 méthodes surchargées.

Peut surcharger les constructeurs de classes, les méthodes.

Peut être considéré comme un polymorphisme au moment de la compilation (statique / liaison précoce).

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

Primordial ne peut pas être possible dans la même classe. Peut remplacer les méthodes de classe, les propriétés, les indexeurs et les événements.

Possède des limitations telles que La méthode de base remplacée doit être virtuelle, abstraite ou remplacée. Vous ne pouvez pas utiliser les modificateurs new, static ou virtual pour modifier une méthode de remplacement.

Peut être considéré comme un polymorphisme d'exécution (liaison dynamique / tardive).

Aide à la gestion des versions http://msdn.microsoft.com/en-us/library/6fawty39.aspx

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

Liens utiles

http://msdn.microsoft.com/en-us/library/ms173152.aspx Polymorphisme à la compilation vs polymorphisme à l'exécution


Bon, avec les détails nécessaires.
user3885927

1

La surcharge fait partie du polymorphisme statique et est utilisée pour implémenter différentes méthodes avec le même nom mais des signatures différentes. Le remplacement est utilisé pour terminer la méthode incomplète. À mon avis, il n'y a pas de comparaison entre ces deux concepts, la seule chose est similaire, c'est que les deux viennent avec le même vocabulaire qui est fini.


Captain here: La surcharge d'une méthode vous donne plusieurs signatures de différentes méthodes avec le même nom. Le remplacement masque un membre hérité, que ce soit des classes ou des interfaces. s'envole
SparK

1
@SparK Overriding ne masque pas un membre. Vous pouvez soit remplacer ou masquer un membre hérité. Les deux sont des options mutuellement exclusives.
Servy

@Servy, mauvais choix de mots, je voulais dire "substituts".
SparK

0

La surcharge de méthode et le remplacement de méthode sont deux concepts complètement différents. La surcharge de méthode porte le même nom de méthode mais avec des signatures différentes. Le remplacement de méthode modifie l'implémentation par défaut de la méthode de classe de base dans la classe dérivée. Vous trouverez ci-dessous 2 excellents didacticiels vidéo expliquant ces concepts.

Méthode remplaçant Vs masquage

Surcharge de méthode


0

La surcharge est le concept dans lequel vous avez les mêmes signatures ou méthodes avec le même nom mais des paramètres différents et la substitution, nous avons le même nom, les méthodes avec des paramètres différents ont également l'héritage est connu comme le remplacement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.