Introduktion til tilsidesættelse i C #

Overstyring i C # er genimplementering af en baseklasse-metode i en afledt klasse. I dette tilsidesættes baseklasse-metoden i børneklasse. Den afledte klassemetode har samme navn og signatur som baseklasse-metoden. Overstyring er nyttigt til at opnå Runtime-polymorfisme.

Der er et par søgeord, der bruges til metodeoverskridelse.

1. Virtuel - Dette nøgleord bruges med en baseklasse, der betyder, at metoden til en baseklasse kan tilsidesættes.

public virtual void Method()
(
// implementation
)

2. Overstyring - Dette nøgleord bruges med en afledt klasse, der betyder, at afledt klasse tilsidesætter en metode til en baseklasse.

public override void Method()
(
// implementation
)

3. Base - Dette nøgleord bruges i en afledt klasse til at kalde basisklasse-metoden.

public override void Method()
(
base.Method();
// implementation
)

Hvordan fungerer overstyring i C #?

Nedenfor er et eksempel på, hvordan vi kan implementere tilsidesættelse i C #.

class Parent
(
public virtual void Demo() // base class
(
Console.WriteLine(“This is parent”);
)
)
class Child: Parent
(
public override void Demo() // derived class
(
Console.WriteLine(“This is child”);
)
)

I ovenstående eksempel er der to klasser, den ene er baseklasse eller forældreklasse, og den anden er afledt klasse, eller vi kan sige, barneklasse. En baseklasse-metode er afledt i barneklasse. I dette er metoden i en forælder virtuel, hvilket betyder, at den kan tilsidesættes af barneklassen. Overstyring hos et barn betyder, at denne metode er den samme som forældreklasse-metoden med den samme metodesignatur.

Typer af tilsidesættelse i C #

Nedenfor er eksemplerne, der viser altoverskyggende med forskellige søgeord.

Eksempel 1 - Uden virtuelle og tilsidesætte nøgleord

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public new void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)

I ovenstående eksempel bruges intet nøgleord i både baser såvel som afledte metoder.

Også i hovedmetoden bruges forælderreference til at kalde underordnet metode. Så i dette tilfælde, når der ikke anvendes noget nøgleord, kaldes den overordnede metode i stedet for en underordnet metode. Så output vil være

Output:

Eksempel 2 (a) - Med virtuelle og tilsidesatte nøgleord

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)

I dette eksempel bruges virtuel i baseklassen, hvilket betyder, at den giver autoritet til barneklasse til at implementere metoden på sin egen måde. I en afledt klasse bruges tilsidesættelse, hvilket betyder, at underordnet-metoden er overstyringsmetoden. Begge metoder er de samme med samme navn og samme metodesignatur, men implementeringsdelen er forskellig. I dette eksempel bruges også forælderreference til at kalde underordnet metode. Men som en forælder er en metode, der er virtuel, så kaldes barnet-metoden først i stedet for forældremetoden. Så output vil være

Output:

Eksempel 2 (b) - Virtuelle og tilsidesætte nøgleord

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
//main method
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)

Dette eksempel er det samme som det foregående eksempel, men denne underordnede metode bruges til reference.

Output:

Eksempel 3 - Med basisnøgleord

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
base.fly(); // base is use to call parent method
Console.WriteLine("Peacock is flying");
)
)
class Program
(
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)

I ovenstående eksempel bruges basen i en afledt klasse til at kalde baseklasse-metoden. Så i denne basismetode kaldes først og derefter den afledte metode.

Output:

Eksempel 4 - Abstrakte klasser med tilsidesættelse

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
abstract class Calculate
(
public abstract int sum();
)
class Values : Calculate // derived class
(
int val1;
int val2;
public Values(int a = 0, int b = 0)
(
val1 = a;
val2 = b;
)
public override int sum()
(
Console.WriteLine("sum of two values");
return (val1 + val2);
)
)
class Program
(
static void Main(string() args)
(
Values v = new Values(10, 20);
int a = v.sum();
Console.WriteLine(a);
Console.ReadLine();
)
)
)

I ovenstående eksempel anvendes en abstrakt metode. En abstrakt klasse implementeres af den afledte klasse, der indeholder en abstrakt metode.

Output:

Regler for metodeoverskridelse

  • Metodesignaturen for en afledt klasse skal være den samme som en baseklasse.
  • Overstyring er ikke muligt i samme klasse.
  • Adgangsmodifikatorer skal være de samme for virtuelle metoder og tilsidesætte metoder.
  • Det virtuelle nøgleord bruges i baseklasse-metoden, og tilsidesættelse bruges i en afledt klassemetode.
  • Baseklasse-metoden skal ikke være statisk.

Konklusion

Overstyring er nyttigt ved polymorfisme af runtime. Det giver afledt klasse at implementere en baseklasse-metode på sin egen måde. Så metodeimplementeringen er forskellig fra afledt klasse fra dens baseklasse. Den tilsidesatte metode kan være virtuel, tilsidesat eller abstrakt.

Anbefalede artikler

Dette er en guide til tilsidesættelse i C #. Her diskuterer vi, hvordan man bruger overordnede og forskellige nøgleord til tilsidesættelse i C # sammen med eksempler. Du kan også gennemgå vores andre foreslåede artikler -

  1. Undtagelseshåndtering i C #
  2. Arrays i C #
  3. Metodeoverskridelse i C #
  4. Variabler i C #
  5. Få adgang til modifikatorer i PHP
  6. Polymorfisme i Java
  7. Abstrakte klasser i JavaScript
  8. Eksempler på dette nøgleord

Kategori: