base() constructor wie in java?

Hi. Ich war der erste, der die Frage gestellt hat und ich habe einen Weg gefunden base constructor überal in meinem constructor aufzurufen.
Code:
//normaly you can call base constructor at start in your new constructor
public constructor():base(){
   this.name = "test";
}

//virtual constructor pattern emulates calling of your constructor whre you want
public constructor(){
   this.name = "test";
   base();//it is not supported by language directly so you need virtual consructor pattern to emulate it
}

dafür habe ich ein neues design pattern entwickelt und ein Artikel drüber geschrieben

http://www.codeproject.com/useritems/Virtual_constructor.asp

wenn ihr Lust habet lesst es durch;-)
 
Altes Thema, aber ich hab da noch ne Frage dazu.

Hi

Ich erbe von einer Klasse MyBase, welche einen Konstruktor mit 4 Parametern hat.

public MyBase(int a, int b, int c, int d){
}

ich möchte nun in meiner abgeleiten Klasse einen Konstruktor erstellen, welcher nur einen Parameter erhält und dann den Konstruktor von der geerbten Klasse aufrufen:

public MyDerived(String s) {
// aus s leite ich die Werte für a, b, c, d ab
// nun mach mir ein MyBase()-Objekt
}

Aber das scheint geht ja nach OOP-Paradigma nicht, dass Subklassen immer zuerst den Konstruktor der Basisklassen aufrufen müssen.

Aber wie könnt' ich sonst mein Vorhaben realisieren?

Norbert meint, dass Design ist falsch. Wäre es denn besser, ich würde die Parameterliste a-d streichen und dafür eine init()-Methode mit diesen Parametern erstellen und nach der Instanzierung init() aufrufen? Aber dann habe ich einen zweizeiler.... :p

Ideen
Cheerioh SiS
 
Hi

Wenn du das unbedingt in einer Zeile haben willst, dann mach dir doch eine FactoryMethode:
C#:
class Program
    {
        static void Main(string[] args)
        {
            DerivedClass c = DerivedClass.CreateInstance("1|2");
        }
    }

    class BaseClass
    {
        private int a;
        private int b;

        public BaseClass()
        {

        }

        public BaseClass(int a, int b)
        {
            this.a = a;
            this.b = b;
        }
    }

    class DerivedClass : BaseClass
    {
        public static DerivedClass CreateInstance(string s)
        {
            string[] tmp = s.Split("|".ToCharArray());
            DerivedClass c = (DerivedClass)new BaseClass(Convert.ToInt32(tmp[0]), Convert.ToInt32(tmp[1]));
            return c;
        }
    }
 
Oops :-(
Stimmt, nur Kompilieren hilft doch nicht immer ^^

Hier eine Variante, die geht:
C#:
class Program
    {
        static void Main(string[] args)
        {
            DerivedClass c = DerivedClass.CreateInstance("1|2");
        }
    }

    abstract class BaseClass
    {
        private int a;
        private int b;

        protected void Init(int a, int b)
        {
            this.a = a;
            this.b = b;
        }
    }

    class DerivedClass : BaseClass
    {
        public static DerivedClass CreateInstance(string s)
        {
            string[] tmp = s.Split("|".ToCharArray());
            DerivedClass c = new DerivedClass();
            c.Init(Convert.ToInt32(tmp[0]), Convert.ToInt32(tmp[1]));
            return c;
        }
    }
 
Hi Nico

Wie angetönt, habe ich es bereits mit der init()-Methode gelöst. Die Factory-Methode wäre ja interessant, aber es lassen sich (logischerweise) Subklassenreferenzen keine Basisklassenreferenzen zuweisen. Es bleibt mir also nur die Init-Variante übrig, oder die Basisklasse anzupassen - richtig?

thx
SiS
 

Neue Beiträge

Zurück