base() constructor wie in java?

zarrandreas

Mitglied
Hi

ich kenne aus java das man dort den super constructor an einer belibigen Stelle aufrufen kann
z.B.
java code


PHP:
public class Test extends Parent{

String text;

public Test(){
this.text = "Hallo";
super();
} 

}

c# code

PHP:
public class Test : Parent{

String text;

public Test():base(){
this.text = "Hallo";
} 

}

ich möchte aber base constructor erst später aufrufen, genau wie in java

das geht leider in c# nicht :(
PHP:
public class Test : Parent{

String text;

public Test(){
this.text = "Hallo";
base()
} 

}

Es ist aber wichtig constructor der erweiterten Klasse an einer bestimmter Stelle aufruffen, z.B. für Factory Method Pattern.

Kann jemand da mir weiter helfen?:offtopic:
 
Hallo!

public class Test extends Parent{

String text;

public Test(){
this.text = "Hallo";
super();
}

}
Also das geht in Java auch nicht... der Konstruktor der Basisklasse (super(...)) muss immer der erste Aufruf im Konstruktor der abgeleiteten Klasse sein, entweder explizit, oder implizit.

Gruß Tom
 
Der Konstruktor der Basisklasse wird ohnehin immer aufgerufen. Was du aber machen kannst, ist auf Methoden der Basisklasse mittels base zuzugreifen.

Basisklasse
C#:
public class BaseClass
{   
    public virtual string TestString() 
    {
        return "teststring - baseclass";
    }
    
    public BaseClass()
    {
        Console.WriteLine("constructor baseclass");
    }
}

Abgeleitete Klasse
C#:
public class ConcreteClass : BaseClass
{
    public override string TestString()
    {
        return "teststring - concreteclass";
    }

    public ConcreteClass(string test) : this() 
    {
    }

    public ConcreteClass()
    {
        Console.WriteLine(base.TestString());
        Console.WriteLine(this.TestString());
    }
}

Es würde auch relativ wenig Sinn machen, den Konstruktor der Basisklasse erst später aufzurufen .. denn wäre das notwendig, dann ist vermutlich wohl das Design nicht ganz das richtige ...
 
Hallo!

Es würde auch relativ wenig Sinn machen, den Konstruktor der Basisklasse erst später aufzurufen .. denn wäre das notwendig, dann ist vermutlich wohl das Design nicht ganz das richtige ...
... vor allem wäre das Problematisch, da durch den Aufruf des Konstruktors der Basis Klasse wichtige Initialisierungen durchgeführt werden, die dann einfach fehlen würden, Sprich man würde dann mit einer "unfertigen" Instanz arbeiten, da ist das gößte Problem an der Sache und Grund weshalb das so nicht erlaubt ist.

Gruß Tom
 
Hallo,

Kleine Zwischenfrage, was bedeuten diese Zeilen hier?
PHP:
public ConcreteClass(string test) : this()
{
}

Danke schön!

Gruß Stefan
 
Das ist nur ein zweiter Konstruktor, dem man einen Parameter übergeben kann. Durch das :this() wird der Konstruktor ohen Parameter ebenfalls aufgerufen.

Weitere Beispiele:
C#:
public ConcreteClass(string test1, string test2) : this(test2)
{
}

public ConcreteClass(string test1) : this()
{
}

public ConcreteClass()
{
}
Nun, bei folgender Instanzierung
C#:
ConcreteClass cc = new ConcreteClass("test1", "test2");
werden alle 3 Konstruktoren ausgeführt. Zuerst der Konstruktor mit den Parametern test1 und test2. Dieser Übergibt den Parameter test2 an den Konstruktor ConcreteClass(string test1) weiter, welcher zum Schluss nun den Konstruktor ohne Parameter aufruft.
 
Hallo!

Damit rufst du aus dem einen Konstruktor ConcreteClass(string test) unmittelbar den parameterlosen Konstruktor ConcreteClass() auf.

Beispiel:
C#:
using System;
using System.Collections.Generic;
using System.Text;

namespace De.Tutorials.Training
{
    class SimpleExample
    {
        public static void Main(string[] args)
        {
            new Derived("Foo");
        }
    }

    class Base
    {
        public Base()
        {
            Console.WriteLine("Base");
        }
    }

    class Derived : Base
    {

        string data;

        public Derived()
        {
            Console.WriteLine("Derived ()");
        }


        public Derived(string data) : this()
        {
            this.data = data;
            Console.WriteLine("Derived (string)");
        }
    }
}

Ausgabe:
Code:
Base
Derived ()
Derived (string)
Drücken Sie eine beliebige Taste . . .

In Java sähe das so aus:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 * 
 */
public class SimpleExample {

    static class Base {
        public Base() {
            System.out.println("Base");
        }
    }

    static class Derived extends Base {

        String data;

        public Derived() {
            System.out.println("Derived ()");
        }

        public Derived(String data) {
            this();
            this.data = data;
            System.out.println("Derived (string)");
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Derived("Foo");
    }

}

Gruß Tom
 
Hallo Tutorialer!

Mann kann aber auch dem BasisKonstruktor vorab Initialisierungswerte übergeben:
C#:
class MyBase
{
    string baseString;

    protected MyBase( string baseString ) {
        this.baseString = baseString;
        Console.WriteLine( "baseClass: " + baseString );
    }
}

class MyClass : MyBase
{
    public MyClass( string testString ) : base( testString ) {
        Console.WriteLine( "mainClass: " + baseString );
    }
}
C#:
new MyClass( "Test" );
Ausgabe:
Code:
baseClass: Test
mainClass: Test
MfG,
cosmo
 

Neue Beiträge

Zurück