Sobrecarga y anulación


104

¿Cuál es la diferencia entre sobrecargar y anular?


2
@james: ¿al menos probaste google ??
Mitch Wheat

Supongo que no vas a conseguir este.
Jon B

james- probablemente no y me siento bastante tonto por no poder explicar un concepto simple

1
@james supongo que intuiste estos conceptos sin conocer los términos. Supongo que eres autodidacta. Probablemente debería elegir un libro de C # para principiantes, no para aprender sino para reforzar lo que ya sabe. Es abrumador, pero ayudará enormemente en las entrevistas técnicas.
Michael Meadows

puede leer más en este enlace: intquesans.blogspot.com/2011/05/…

Respuestas:


219

Sobrecarga

La sobrecarga es cuando tiene varios métodos en el mismo alcance, con el mismo nombre pero con diferentes firmas.

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

Primordial

La invalidación es un principio que le permite cambiar la funcionalidad de un método en una clase secundaria.

//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
Me encanta esta respuesta @cgreeno .. Gracias
Ferrakkem Bhuiyan

1
@cgreeno creo que se le pasa voidpor getStuffentest2
Mahdi

2
solo para mencionar que el método de la clase base debe estar marcado como virtual para anularlo, de lo contrario, obtendrá un error de compilación.
Alex Stephens

Oye, esto puede ser antiguo, pero todavía tengo una pregunta sobre esto. ¿La sobrecarga hace que esté disponible para tener más funcionalidad con el método "uno"? Como puedo hacer esto: ¿ getStuff(2, "Hello world!");o puedo hacer esto getStuff("Myname", "Mysurname", "Hello World!");? ¿Alguien puede confirmar que esta es la forma de hacerlo?
Sj03rs

Creo que el ejemplo de Anulación en realidad es Sobreescritura, anular es cuando su método de superclase se anula accidentalmente o si tiene la intención de hacerlo usando la nueva palabra clave en ambos casos, anular o sobrescribir, el comportamiento es diferente cuando declara Padre p = nuevo Niño(); p.Method (); ... tal vez me equivoque y es solo otra forma de hacer casi lo mismo. ¿Alguien puede explicarlo mejor que yo?
Cristina Carrasco

35

Definiciones simples para sobrecargar y anular

Sobrecarga (polimorfismo de tiempo de compilación) :: Funciones con el mismo nombre y diferentes parámetros

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) :: Funciones en la clase extendida con el mismo nombre y los mismos parámetros que en la clase base, pero con diferentes comportamientos.

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

Quizás le gustaría agregar que el concepto primordial se aplica a la relación clase-subclase principal.
Freakyuser

10

Quiero compartir un ejemplo que tuvo mucho sentido para mí cuando estaba aprendiendo:

Este es solo un ejemplo que no incluye el método virtual ni la clase base. Solo para dar una pista sobre la idea principal.

Digamos que hay una lavadora de vehículos y tiene una función llamada "Lavar" y acepta Coche como un tipo.

Obtiene la entrada del coche y lava el coche.

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

Sobrecarguemos la función Wash ()

Sobrecarga:

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

La función de lavado solo lavaba un automóvil antes, pero ahora también está sobrecargada para lavar un camión.

  • Si el objeto de entrada proporcionado es un automóvil, ejecutará Wash (Car anyCar)
  • Si el objeto de entrada proporcionado es un camión, ejecutará Wash (Truck anyTruck)

Anulemos la función 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 función de lavado ahora tiene una condición para verificar si el automóvil ya está limpio y no es necesario lavarlo nuevamente.

  • Si el automóvil está limpio, simplemente encerelo.

  • Si no está limpio, primero lave el automóvil, luego séquelo y luego encerelo

.

Entonces, la funcionalidad se ha anulado al agregar una nueva funcionalidad o hacer algo totalmente diferente.


1
Esta debe ser la respuesta. Votado +
Jack

9
  • Sobrecarga = múltiples firmas de métodos, mismo nombre de método
  • Anulación = Firma del mismo método (declarado virtual), implementado en subclases

Un entrevistador astuto habría seguido con:

¿Cuál es la diferencia entre anular y sombrear?


Nunca supe que se llamaba sombreado, es bueno saberlo. La única relación que tienen la sobrecarga y la anulación es la sobrecarga.
Samuel

4

Como dijo Michael:

  • Sobrecarga = múltiples firmas de métodos, mismo nombre de método
  • Anulación = Firma del mismo método (declarado virtual), implementado en subclases

y

  • Sombreado = Si se trata como DerivedClass, usó el método derivado, si como BaseClass usa el método base.

3

Tener más de un método / constructor con el mismo nombre pero diferentes parámetros se llama sobrecarga. Este es un evento de tiempo de compilación.

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

La anulación es un evento en tiempo de ejecución, lo que significa que, según su código, la salida cambia en tiempo de ejecución.

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

Observe que hay un método común en ambas clases topSpeed ​​(). Desde que creamos una instancia de Ferrari, obtenemos un resultado diferente.

O / p:

Top speed for this car is: 400

2

en C # no hay Java como anulación oculta , sin anulación de palabras clave en el método de anulación. vea estas implementaciones de C #:

variante 1 sin anulación : el resultado es 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 con palabra clave de anulación : el resultado es 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();
    }

la palabra clave virtual en la clase Car es opuesta a final en Java, significa que no es final , puede anular o implementar si Car era abstracto


1

shadowing = mantiene dos definiciones en la clase derivada y, para proyectar la definición de la clase base, sombrea (oculta) la definición de la clase derivada y viceversa.


1

Otro punto para agregar.

Sobrecarga de más de un método con el mismo nombre. Mismo tipo de devolución o diferente. Diferente número de parámetros o Diferente tipo de parámetros. En la misma clase o clase derivada.

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

Puede ser posible en la misma clase o clase derivada. Generalmente prefiere en la misma clase. Por ejemplo, Console.WriteLine () tiene 19 métodos sobrecargados.

Puede sobrecargar constructores de clases, métodos.

Se puede considerar como polimorfismo en tiempo de compilación (estático / enlace temprano).

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

No es posible anular en la misma clase. Puede anular métodos de clase, propiedades, indexadores, eventos.

Tiene algunas limitaciones, como El método base anulado debe ser virtual, abstracto o anulado. No puede utilizar los modificadores nuevos, estáticos o virtuales para modificar un método de anulación.

Se puede considerar como polimorfismo en tiempo de ejecución (enlace dinámico / tardío).

Ayuda en el control de versiones http://msdn.microsoft.com/en-us/library/6fawty39.aspx

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

Enlaces Útiles

http://msdn.microsoft.com/en-us/library/ms173152.aspx Polimorfismo en tiempo de compilación frente a polimorfismo en tiempo de ejecución


Buena, con los detalles necesarios.
user3885927

1

La sobrecarga es parte del polimorfismo estático y se usa para implementar diferentes métodos con el mismo nombre pero con diferentes firmas. La anulación se utiliza para completar el método incompleto. En mi opinión no hay comparación entre estos dos conceptos, lo único que es similar es que ambos vienen con el mismo vocabulario que se acabó.


Capitán aquí: Sobrecargar un método le brinda múltiples firmas de diferentes métodos con el mismo nombre. La invalidación oculta un miembro heredado, ya sea de clases o interfaces. vuela lejos
SparK

1
@SparK Overriding no oculta un miembro. Puede ya sea anular o ocultar un miembro heredado. Las dos son opciones mutuamente excluyentes.
Servicio

@Servy, elección incorrecta de palabras, quise decir "sustitutos".
SparK

0

La sobrecarga de métodos y la anulación de métodos son dos conceptos diferentes completamente diferentes. La sobrecarga de métodos tiene el mismo nombre de método pero con diferentes firmas. La invalidación del método es cambiar la implementación predeterminada del método de la clase base en la clase derivada. A continuación puede encontrar 2 excelentes tutoriales en video que explican estos conceptos.

Método que anula Vs ocultar

Sobrecarga de métodos


0

La sobrecarga es el concepto en el que tiene las mismas firmas o métodos con el mismo nombre pero diferentes parámetros y anulación, tenemos métodos con el mismo nombre con diferentes parámetros y también tenemos herencia que se conoce como anulación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.