Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   C# Übergeordneten Konstruktor aufrufen (https://www.delphipraxis.net/40323-uebergeordneten-konstruktor-aufrufen.html)

mirage228 14. Feb 2005 12:19


Übergeordneten Konstruktor aufrufen
 
Hallo,

ich habe in C# eine Klasse, die von einer anderer Klasse abgeleitet ist. Nun soll diese Klasse den geerbten Konstruktor aufrufen, wie es mit "inherited Create(...)" in Delphi geht.

Wie kann ich das mit C# anstellen?

mfG
mirage228

P.S.: Wieso können Konstruktoren nicht virtuell sein? :gruebel:

Edit: Schlechtschreibung :stupid:

maximov 14. Feb 2005 12:25

Re: Übergeordneten Konstruktor aufrufen
 
Moin,

das zauberwort heisst "Base"...
Delphi-Quellcode:
pblic class bla
{
   public bla(int i):base(i)
   {
     ...;
   }

}
vom prinzip her.

mirage228 14. Feb 2005 12:26

Re: Übergeordneten Konstruktor aufrufen
 
Hi maximov,

Super, das klappt - Danke sehr :)

mfG
mirage228

Robert_G 14. Feb 2005 12:27

Re: Übergeordneten Konstruktor aufrufen
 
Zitat:

Zitat von mirage228
P.S.: Wieso können Konstruktoren nicht virtuell sein? :gruebel:

Weil sie gar nicht virtuell sein müssen. Bei Konstruktoren kann das komplett der Compiler übernehmen.
du kannst mit this(XXX) einen Kontruktor deiner Klasse aufrufen. Mit base(XXX) einen des Vorgänergs.

Sollte eigentlich alles erklären:
Code:
    public class Base
   {
        string name;

       public string Name
       {
           get { return name; }
       }

       public Base(string name)
       {
           this.name = name;
       }
   }

    public class Descendant :Base
    {
        string description;

        public string Description
        {
            get { return description; }
            set { description = value; }
        }

        public Descendant(string name)
            : base(name)
        {}

        public Descendant(string name, string description)
            : this(name)
        {
            this.description = description;
        }
    }

mirage228 14. Feb 2005 12:29

Re: Übergeordneten Konstruktor aufrufen
 
Hi Robert,

Danke für die Erklärung :)

Das ganze heisst aber doch, dass
  • ich den anderen Konstruktoren nicht später aufrufen kann, wenn z.B. noch vorher was initialisiert werden muss?
  • ich den geerbten Konstruktor aufrufen muss? (Kriege sonst die Fehlermeldung: [C# Fehler] PHPInspector.cs(73): Keine Überladung für die Methode 'TPHPEntity' erfordert '0' Argumente)

mfG
mirage228

LarsMiddendorf 14. Feb 2005 12:36

Re: Übergeordneten Konstruktor aufrufen
 
Einen virtuellen Konstruktor kann man in C# mit der Klasse Activator und der Methode CreateInstance emulieren.

Code:
Activator.CreateInstance(Type type,params object[] args);

Robert_G 14. Feb 2005 12:37

Re: Übergeordneten Konstruktor aufrufen
 
  • wäre IMHO sowieso schlechtes Design
  • klar!
    Du musst bedenken, dass du alle Kontruktoren implementieren musst, die du auch weiterhin in deiner Hierarchie haben willst.
    Ist aber zum Beispiel in #Develop/VS03+ReSharper (aber erst mit dem :roll: ) ein peace of cake: [alt+einfg] -> Constructors -> auswählen -> Enter :)
    Er wird dir dann auch den Aufruf zum Basiskonstruktor durchschleifen. (Habe ich in meinem Beispiel so gemacht :) )

Nachtrag:
Zitat:

Zitat von LarsMiddendorf
Einen virtuellen Konstruktor kann man in C# mit der Klasse Activator und der Methode CreateInstance emulieren.

Code:
Activator.CreateInstance(Type type,params object[] args);

Aber nur mit einer statischen Funktion, nicht mit einem richtigen Constructor. (Oder rede ich jetzt Blödsinn? .:gruebel: )

mirage228 14. Feb 2005 12:45

Re: Übergeordneten Konstruktor aufrufen
 
Zitat:

Zitat von Robert_G
wäre IMHO sowieso schlechtes Design

Das Problem sieht derzeit bei mir so aus:
  • Klasse B ist Ableitung von A
  • Klasse A setzt im Konstruktor eine property die auf eine virtuelle (und damit evtl. überschriebene) Methode zurückgreift
  • Klasse B überschreibt diese virtuelle Methode und greift dabei auf Felder zu, die ja in B erst erstellt werden müssen, bevor der Konstruktor von A aufgerufen wird
Aber nun gut, wenn es nicht anderes geht, werde ich den Teil halt umschreiben müssen. :?

Zitat:

Zitat von Robert_G
klar! Du musst bedenken, dass du alle Kontruktoren implementieren musst, die du auch weiterhin in deiner Hierarchie haben willst. Ist aber zum Beispiel in #Develop/VS03+ReSharper (aber erst mit dem :roll: ) ein peace of cake: [alt+einfg] -> Constructors -> auswählen -> Enter :)
Er wird dir dann auch den Aufruf zum Basiskonstruktor durchschleifen. (Habe ich in meinem Beispiel so gemacht :) )

Achso nun gut, das wusste ich nicht - jetzt weiss ich es ;)

Zitat:

Zitat von Robert_G
Nachtrag:
Zitat:

Zitat von LarsMiddendorf
Einen virtuellen Konstruktor kann man in C# mit der Klasse Activator und der Methode CreateInstance emulieren.

Code:
Activator.CreateInstance(Type type,params object[] args);

Aber nur mit einer statischen Funktion, nicht mit einem richtigen Constructor. (Oder rede ich jetzt Blödsinn? .:gruebel: )

Hm, Danke sehr, werde mal schauen, wie sich das verwenden lässt... :)
mfG
mirage228

Robert_G 14. Feb 2005 12:50

Re: Übergeordneten Konstruktor aufrufen
 
Zitat:

Zitat von mirage228
Zitat:

Zitat von Robert_G
wäre IMHO sowieso schlechtes Design

Das Problem sieht derzeit bei mir so aus:
  • Klasse B ist Ableitung von A
  • Klasse A setzt im Konstruktor eine property die auf eine virtuelle (und damit evtl. überschriebene) Methode zurückgreift
  • Klasse B überschreibt diese virtuelle Methode und greift dabei auf Felder zu, die ja in B erst erstellt werden müssen, bevor der Konstruktor von A aufgerufen wird
Aber nun gut, wenn es nicht anderes geht, werde ich den Teil halt umschreiben müssen. :?

Shit happens... ;)

Zitat:

Zitat von mirage228
Zitat:

Zitat von Robert_G
Nachtrag:
Zitat:

Zitat von LarsMiddendorf
Einen virtuellen Konstruktor kann man in C# mit der Klasse Activator und der Methode CreateInstance emulieren.

Code:
Activator.CreateInstance(Type type,params object[] args);

Aber nur mit einer statischen Funktion, nicht mit einem richtigen Constructor. (Oder rede ich jetzt Blödsinn? .:gruebel: )

Hm, Danke sehr, werde mal schauen, wie sich das verwenden lässt... :)

Bloß nicht!
Activator verwendet Reflection um die passende ConstructorInfo zu finden. Diese wird dann per Invoke aufgerufen -> viel zu langsam für die meisten Aufgaben!

mirage228 14. Feb 2005 12:55

Re: Übergeordneten Konstruktor aufrufen
 
Zitat:

Zitat von Robert_G
Shit happens... ;)

Hm, joa, ich werds schon überleben :mrgreen:

Zitat:

Zitat von Robert_G
Bloß nicht!
Activator verwendet Reflection um die passende ConstructorInfo zu finden. Diese wird dann per Invoke aufgerufen -> viel zu langsam für die meisten Aufgaben!

Achos, gut, ok. Das soll die Übersetzung meines PHP Inspectors werden, daher wollte ich schon darauf achten, dass das ganze Parsen auch schön schnell abläuft. Da könnte ich "Bremsen" nicht so gut gebrauchen :?

mfG
mirage228

maximov 14. Feb 2005 13:19

Re: Übergeordneten Konstruktor aufrufen
 
Zitat:

Zitat von Robert_G
...
Bloß nicht!
Activator verwendet Reflection um die passende ConstructorInfo zu finden. Diese wird dann per Invoke aufgerufen -> viel zu langsam für die meisten Aufgaben!

Was soll man denn sonst tun? Virtuelle konstruktoren sind einfach nur geil und wenn die activator methode jetzt auch böse ist, soll man sofort ne abstrakte fabrik nehmen? Oder gibs unter .NET noch ander konzepte zum entkoppelten erzeugen der instanzen?

LarsMiddendorf 14. Feb 2005 13:26

Re: Übergeordneten Konstruktor aufrufen
 
Naja kommt auf den Anwendungszweck an. Wenn das ein mehr oder weniger einmaliger Aufruf ist, z.B. in einem Editor ein Objekt erstellen o.Ä. ist das akzeptabel. Tatsache ist aber auch, dass Methodenaufrufe über Reflection sehr langsam sind. Delphi .Net erstellt für jede Klasse noch eine zusätzliche Klasse mit den virtuellen Klassenmethoden und virtuellen Konstruktoren als virtuelle Methoden.
Die virtuellen Konstruktoren in Delphi sind eine schöne und vor allem typesichere Alternative gegenüber den normalen Factories.

Robert_G 14. Feb 2005 13:50

Re: Übergeordneten Konstruktor aufrufen
 
@maximov
Du kannst du ja ein wenig in Reflection.Emit belesen.
Damit kannst du deine Typen nicht nur dynamisch erzeugen sondern auch dyn. Assemblies erzeugen, die die Instanzierung und ähnliches erledigen.
Da diese in den RAM kompiliert werden gibt es keine Geschwindigskeitsverluste. (Ist aber alles andere als trivial ;) )

maximov 14. Feb 2005 14:04

Re: Übergeordneten Konstruktor aufrufen
 
@Emit: Ist vielleicht nicht trivial, dafür aber interessant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz