Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 1 von 2  1 2      

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