C# - Függvény felülírása, illetve elfedése

forráskód letöltése
Egy ősosztályban lévő virtuálisan deklarált függvény esetében az ebből származtatott új osztályban lehetőségünk van arra, hogy felülírjuk azt. De azt is megtehetjük, hogy azonos néven egy új függvényt hozunk létre.
Hozzuk létre első lépésként az ősosztályt, ClassBase néven. Ebbe vegyünk fel három függvényt, melyek mindegyike legyen virtuálisként deklarálva. Az egyszerűség kedvéért minden függvény csupán egy sztringet ad vissza, melyből kiderül hogy melyik osztály, melyik függvényéről van szó.
  public class ClassBase
  {
    public virtual string Function1() 
    {
      return "ClassBase_Function1";
    }
    public virtual string Function2() 
    {
      return "ClassBase_Function2";
    }
    public virtual string Function3() 
    {
      return "ClassBase_Function3";
    }     
  }
Tovább lépve, most létrehozzuk a leszármazott osztályt ClassDerived néven, melyet a ClassBase osztályból származtatunk.
  public class ClassDerived: ClassBase
  {
A Function1 függvényt egyszerűen csak felülírjuk az override kulcsszó segítségével.
    public override string Function1() 
    {
      return "ClassDerived_Function1";
    }
A Function2 függvény esetében elfedjük az ősosztálybeli azonos nevű függvényt, vagyis abból egy teljesen új függvényt hozunk létre. Ehhez a new kulcsszót kell alkalmaznunk a függvény deklarációjában.
    public new string Function2() 
    {
      return "ClassDerived_Function2";
    }
Végül az utolsó függvény esetében nem használunk semmilyen kulcsszót, csak egyszerűen deklaráljuk az ősosztálybelivel azonos néven. Ennek következménye szintén az lesz, hogy az ősosztálybeli függvényt elfedjük.
    public string Function3() 
    {
      return "ClassDerived_Function3";
    }     
  }
Mivel a Function3 függvény deklarálásánál nem rendelkeztünk se felülírásról, se elfedésről, ezért a projekt fordításakor egy figyelmeztető üzenetet kapunk a fordítótól, mivel elképzelhető az hogy csak véletlenül alkalmaztuk ugyanazt a nevet, és ez a programunk hibás működéséhez vezethet. Ahogy a figyelmeztető üzenetben is látható, célszerű mindig használnunk az override, illetve new kulcsszavak egyikét.
F:\So\Cso\0242\Override\Class1.cs(41): 'Override.ClassDerived.Function3()' hides inherited member 'Override.ClassBase.Function3()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.
Nézzük most az osztályok felhasználását. Első példában létrehozunk egy példányt a leszármazott osztályból (ClassDerived), de azt az ősosztály típusán (ClassBase) tároljuk. Ennek eredménye az lesz, hogy a Function1 függvény a leszármazott osztályból kerül meghívásra, mivel itt használtuk az override kulcsszót. A másik két esetben pedig az ősosztály függvénye kerül meghívásra.
    private void button1_Click(object sender, System.EventArgs e)
    {
      ClassBase c = new ClassDerived();
      listBox1.Items.Add(c.Function1());
      listBox1.Items.Add(c.Function2());
      listBox1.Items.Add(c.Function3());
    }
Következő példában szintén egy leszármazott osztályt hozunk létre, és saját típusán is tároljuk. Ebben az esetben minden függvény a leszármazott osztályból kerül meghívásra.
    private void button2_Click(object sender, System.EventArgs e)
    {
      ClassDerived c = new ClassDerived();
      listBox1.Items.Add(c.Function1());
      listBox1.Items.Add(c.Function2());
      listBox1.Items.Add(c.Function3());
    }