# C# - Konstruktor komplett überdecken? Chaining abstellen?



## Spitfire777 (21. Nov 2011)

Hi,

kleiner Exkurs zu C#, auch wenns ein Java-Forum ist 

Ein Freund von mir hat gefragt, warum der Konstruktor der Superklasse auch ohne expliziten Base-Aufruf beim Aufruf der Unterkonstruktor aufgerufen wird. Bisher dachte ich, dass mit alleiniger Deklaration eines Unterklassen-Konstruktors der Oberkonstruktor überschrieben wird... habs dann mal aus Eigeninteresse ausprobiert und siehe da:


```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            new Test2();
            Console.ReadKey(true);
        }

        
    }

    public class Test {
        public Test() {
            Console.WriteLine("Test wurde aufgerufen");
        }
    }

    public class Test2 : Test { 
        public Test2() {
            Console.WriteLine("Test2 wurde aufgerufen");
        }
    }
}
```

Ergibt:
Test wurde aufgerufen
Test2 wurde aufgerufen

Ganz ohne Base-Aufruf?!

```
public class Test2 : Test { 
        public Test2() : base() {
            Console.WriteLine("Test2 wurde aufgerufen");
        }
    }
```

Wie überdecke ich denn dann den Konstruktor der Superklasse komplett? 
Macht dann base() überhaupt noch Sinn? (Wenn man davon absehen will, dem Superkonstruktor statische Werte mitzuschieben)


----------



## Noctarius (21. Nov 2011)

Vermutlich wird in C#, genau wie in Java, der Standardkonstruktor einer Klasse immer ausgeführt. Selbst wenn "es keinen Sinn" machen würde, würde es auch nicht schaden da die Reihenfolge der Hierarchie abwärts folgt.


----------



## schlingel (21. Nov 2011)

Noctarius hat recht. Falls dieses Verhalten nicht gewünschst ist, kann man auch einen zweiten Konstruktor definieren der nichts tut und bei der Deklaration explizit auf diesen verweisen:


```
class Test 
{
  public Test() {
     Console.WriteLine("Hallo Welt!");
  }

  public Test(boolean no) 
  {
  }
}

class Test2 : Test
{
  public Test2() : base(false) 
  {
  }
}
```


----------



## faetzminator (21. Nov 2011)

Spitfire777 hat gesagt.:


> Ein Freund von mir hat gefragt, warum der Konstruktor der Superklasse auch ohne expliziten Base-Aufruf beim Aufruf der Unterkonstruktor aufgerufen wird.



Stell dir vor, in dem/den Konstruktor(en) der Superklasse werden irgendwelche Dinge geladen. Was passiert, wenn man diese nicht aufruft? Wie kann man bestimmen, wann welche Konstruktoren von Superklassen aufgerufen werden sollen? Es macht einzig und allein Sinn, es so zu handhaben, wie es aktuell in C#, Java, ... ist


----------



## maki (21. Nov 2011)

.. und in C++ übrigens auch 

Irgendein Konstruktor der  Mutterklasse(n) muss aufgerufen werden, geht gar nicht anders.


----------



## Spitfire777 (21. Nov 2011)

Ja Leute, danke euch! 

Das Autochaining macht hier wohl natürlich Sinn. Gibt doch immer wieder banale Dinge, über die man stolpert. Allein die Tatsache, dass ich in der Praxis das Abstellen des Chainings bei Konstruktoren bei entsprechendem Design nie wirklich gebraucht hab, sollte für die ganze Sache sprechen


----------

