C# | Anulación de métodos

La anulación de métodos en C# es similar a la función virtual en C++ . Method Overriding es una técnica que permite invocar funciones de otra clase (clase base) en la clase derivada. La creación de un método en la clase derivada con la misma firma que un método en la clase base se denomina anulación de métodos. 

En palabras simples, Overriding es una función que permite que una subclase o clase secundaria proporcione una implementación específica de un método que ya proporciona una de sus superclases o clases principales. Cuando un método en una subclase tiene el mismo nombre, los mismos parámetros o firma y el mismo tipo de retorno (o subtipo) que un método en su superclase, entonces se dice que el método en la subclase anula el método en la superclase. clase. La anulación de métodos es una de las formas en que C# logra el polimorfismo en tiempo de ejecución (polimorfismo dinámico) .

El método que se anula mediante una declaración de anulación se denomina método base anulado. Un método de anulación es una nueva implementación de un miembro que se hereda de una clase base. El método base invalidado debe ser virtual, abstracto o invalidado.

Ejemplo:

class base_class
{
    public void gfg();
}

class derived_class : base_class
{
    public void gfg();
}

class Main_Method
{
 static void Main()
 {
    derived_class d = new derived_class();
    d.gfg();
 }
}

Aquí, la clase base se hereda en la clase derivada y se anula el método gfg() que tiene la misma firma en ambas clases. 

En C# podemos usar 3 tipos de palabras clave para la anulación de métodos:

  • palabra clave virtual: este modificador o palabra clave se usa dentro del método de clase base. Se utiliza para modificar un método en la clase base para anular ese método en particular en la clase derivada.
  • anular: este modificador o palabra clave se usa con el método de clase derivada. Se utiliza para modificar un método virtual o abstracto en una clase derivada que se presenta en la clase base.
class base_class
{
    public virtual void gfg();
}

class derived_class : base_class
{
    public override void gfg();
}
class Main_Method
{
 static void Main()
 {
    derived_class d = new derived_class();
    d.gfg();
    
      base_class b = new derived_class();
        b.gfg();
 }
}

Aquí primero, d se refiere al objeto de la clase clase_derivada e invoca gfg() de la clase clase_derivada luego, b se refiere a la referencia de la clase base y contiene el objeto de la clase derivada e invoca gfg() de la clase derivado. Aquí el método gfg() toma permiso de la clase base para anular el método en la clase derivada.

Ejemplo 1: anulación de métodos sin utilizar modificadores virtuales y de anulación

C#

// C# program to demonstrate the method overriding
// without using 'virtual' and 'override' modifiers
using System;
 
// base class name 'baseClass'
class baseClass
 
{
    public void show()
    {
        Console.WriteLine("Base class");
    }
}
 
// derived class name 'derived'
// 'baseClass' inherit here
class derived : baseClass
{
     
    // overriding
    new public void show()
    {
        Console.WriteLine("Derived class");
    }
}
  
class GFG {
     
    // Main Method
    public static void Main()
    {
         
        // 'obj' is the object of
        // class 'baseClass'
        baseClass obj = new baseClass();
        
        
        // invokes the method 'show()'
        // of class 'baseClass'
        obj.show();
         
        obj = new derived();
         
        // it also invokes the method
        // 'show()' of class 'baseClass'
        obj.show();
         
    }
}
Producción: 

Base class
Base class

 

Explicación: En este programa, el objeto obj invoca la clase baseClass dos veces y llama al método show() de la clase baseClass . Para evitar este problema, utilizamos la palabra clave virtual y override.

Ejemplo 2: anulación de métodos utilizando modificadores virtuales y de anulación .

C#

// C# program to illustrate the use of
//'virtual' and 'override' modifiers
using System;
 
class baseClass {
 
    // show() is 'virtual' here
    public virtual void show()
    {
        Console.WriteLine("Base class");
    }
}
 
 
// class 'baseClass' inherit
// class 'derived'
class derived : baseClass
{
     
    //'show()' is 'override' here
    public override void show()
    {
        Console.WriteLine("Derived class");
    }
}
 
class GFG {
     
    // Main Method
    public static void Main()
    {
         
        baseClass obj;
 
        // 'obj' is the object
        // of class 'baseClass'
        obj = new baseClass();
         
        // it invokes 'show()'
        // of class 'baseClass'
        obj.show();
         
 
        // the same object 'obj' is now
        // the object of class 'derived'
        obj = new derived();
         
        // it invokes 'show()' of class 'derived'
        // 'show()' of class 'derived' is overridden
        // for 'override' modifier
        obj.show();
         
    }
}
Producción: 

Base class
Derived class

 

  • Palabra clave base: se utiliza para acceder a los miembros de la clase base desde la clase derivada. Básicamente solía acceder a constructores y métodos o funciones de la clase base. La palabra clave base no puede usarse dentro de un método estático. La palabra clave base especifica qué constructor de la clase base debe invocarse al crear las instancias de la clase derivada.

Uso de la palabra clave base : 

  • Llamar a métodos o funciones de la clase base desde la clase derivada.
  • Llame al constructor internamente de la clase base en el momento de la herencia .

Ejemplo 1:

C#

// C# program to show the use of 'base'
// keyword in method overriding
using System;
 
// base class
public class web {
     
     
    string name = "GeeksForGeeks";
 
    // 'showdata()' is member method,
    // declare as virtual
    public virtual void showdata()
    {
        Console.WriteLine("Website Name: " + name);
    }
}
 
// derived class
// class 'web' is inherits
// class 'stream'
class stream : web {
     
     
    string s = "Computer Science";
     
    //'showdata()' is overridden
    // in derived class
    public override void showdata()
    {
         
        // Calling 'showdata()' of base
        // class using 'base' keyword
        base.showdata();
         
        Console.WriteLine("About: " + s);
    }
}
 
class GFG {
     
    // Main Method
    static void Main()
    {
         
        // 'E' is object of class stream
        // also works as object of
        // class 'web'
        stream E = new stream();
         
         
        // it first invokes 'showdata()'
        // of class 'web' then it invokes
        // 'showdata()' of class 'stream'
        E.showdata();
         
    }
}
Producción: 

Website Name: GeeksForGeeks
About: Computer Science

 

Ejemplo 2: cómo la palabra clave base especifica la llamada del constructor de clase base de la clase derivada cuando se crean instancias de clase derivada.

C#

// C# program to show how base keyword
// specifies the calling of base-class
// constructor from the derived class
// when derived class instances are created
using System;
 
// base class
public class clssA {
     
    int n1, n2;
 
    // default constructor
    public clssA()
    {
        Console.WriteLine("Default Constructor Invoked");
    }
 
    // parameterized constructor
    public clssA(int i, int j)
    {
         
        // construct values
        n1 = i;
        n2 = j;
        Console.WriteLine("Parameterized Constructor Invoked");
        Console.WriteLine("Invoked Values are: " + n1 + " and " + n2);
    }
}
 
// derived class
public class DerivedClass : clssA
{
     
    // This constructor will instantiate
    // 'clssA()' [no argument constructor]
    // using 'base' keyword
    public DerivedClass() : base() { }
 
 
    // This constructor will instantiate
    // 'clssA(int i, int j)' [parameterized
    // constructor] using 'base' keyword
    public DerivedClass(int i, int j) : base(i, j) { }
 
// Main Method
static void Main()
{
     
    // invoke no argument constructor
    DerivedClass d1 = new DerivedClass();
     
    Console.WriteLine();
 
    // invoke parameterized constructor
    DerivedClass d2 = new DerivedClass(10, 20);
     
}
}

Producción: 
 

Default Constructor Invoked

Parameterized Constructor Invoked
Invoked Values are: 10 and 20

Ejemplo 3: muestra cómo la palabra clave base especifica el constructor de la clase base llamado desde la clase derivada y también la llamada de un método usando la palabra clave base desde la clase derivada.

C#

// C# program to show how 'base' keyword specifies
// the base-class constructor that called from
// derived class and also calling a method 'swap'
// from derived class using base keyword
using System;
 
// base class
public class clssA {
     
    public int n1, n2;
 
    // default constructor
    public clssA()
    {
        Console.WriteLine("In clssA 'no argument constructor' invoked");
    }
 
    // parameterized constructor
    public clssA(int i, int j)
    {
         
        // construct values
        n1 = i;
        n2 = j;
        Console.WriteLine("in clssA 'parameterized constructor' invoked");
        Console.WriteLine("the invoked values are " + n1 + " and " + n2);
        Console.WriteLine();
    }
 
    public virtual void swap()
    {
        Console.WriteLine("swap function of base class(clssA) invoked");
        Console.WriteLine("Before swap num1 = {0} and num2 = {1}", n1, n2);
 
        // swapping
        int t = n1;
        n1 = n2;
        n2 = t;
        Console.WriteLine("After swap num1 = {0} and num2 = {1}", n1, n2);
    }
}
 
// derived class
public class DerivedClass : clssA {
     
    // This constructor will instantiate
    // 'clssA' [no argument constructor]
    // using 'base' keyword
    public DerivedClass() : base() { }
 
    // This constructor will instantiate
    // 'clssA' [parameterized constructor]
    // using 'base' keyword
    public DerivedClass(int i, int j) : base(i, j) { }
 
    public override void swap()
    {
         
        // it access the swap function of
        // 'clssA' using 'base' keyword
        base.swap();
         
        Console.WriteLine();
 
        Console.WriteLine("Swap function of derived class invoked");
        Console.WriteLine("Before swap num1 = {0} and num2 = {1}", n1, n2);
 
        // swapping
        int t = n1;
        n1 = n2;
        n2 = t;
        Console.WriteLine("After swap num1 = {0} and num2 = {1}", n1, n2);
    }
 
// Main Method
static void Main()
{
     
    // invoke no argument constructor
    DerivedClass d1 = new DerivedClass();
     
    Console.WriteLine();
 
    // invoke parameterized constructor
    DerivedClass d2 = new DerivedClass(10, 20);
     
    // calling swap function
    d2.swap();
     
}
}

Producción: 

In clssA 'no argument constructor' invoked

in clssA 'parameterized constructor' invoked
the invoked values are 10 and 20

swap function of base class(clssA) invoked
Before swap num1 = 10 and num2 = 20
After swap num1 = 20 and num2 = 10

Swap function of derived class invoked
Before swap num1 = 20 and num2 = 10
After swap num1 = 10 and num2 = 20

Nota:

  • La anulación de métodos solo es posible en clases derivadas. Porque un método se anula en la clase derivada de la clase base.
  • No se puede anular un método no virtual o estático.
  • Tanto el método de anulación como el método virtual deben tener el mismo modificador de nivel de acceso.

Publicación traducida automáticamente

Artículo escrito por SoumikMondal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *