C# - Konstruktor komplett überdecken? Chaining abstellen?

Spitfire777

Bekanntes Mitglied
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:

Java:
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?!
Java:
    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

Top Contributor
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

Gesperrter Benutzer
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:

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

  public Test(boolean no) 
  {
  }
}

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

faetzminator

Gesperrter Benutzer
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 :)
 
M

maki

Gast
.. und in C++ übrigens auch ;)

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

Spitfire777

Bekanntes Mitglied
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 :D
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben