Autor Beitrag
Exabyte
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 15.08.11 11:31 
Hallo zusammen!

Ich kenne mich noch nicht so gut aus mit Visual C# und mir taten sich beim Lesen meines Buches ein paar Fragen auf, auf die ich noch keine Antwort finden konnte:

Gibt es eine Möglichkeit, innerhalb einer Klasse mehrere verschiedene Konstruktoren zu definieren, die aber alle denselben Datentyp als Argument benötigen? Mein Problem ist Folgendes: Wenn ich eine Klasse habe, die zwei Variablen desselben Typs als Eigenschaften besitzt und ich dann zwei Konstruktoren implentiere, die beide denselben Datentyp als einzigen Parameter verlangen wird mir von IntelliSense nur einer der beiden Kontruktoren angezeigt, wenn ich eine Instanz der Klasse erstelle. Ich möchte aber, dass man das Objekt mit beiden Variablen, nur einer oder nur der anderen initialisieren kann. (Das Programm kann ja in diesem Fall im Prinzip nicht wissen, welcher der beiden Konstruktoren es benutzen soll).

Wie genau geht eigentlich das Programm beim Erstellen einer Instanz einer Klasse vor, d.h. wenn ich keine Parameter an die Konstruktoren der Basisklasse weiterleite, wird dann einfach neben dem Kontruktor der abgeleiteten Klasse auch derjenige der Basisklasse (ohne Parameter) aufgerufen?
dark-destination1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: Mo 15.08.11 11:33 
füge doch noch ein boolschen wert als parameter hinzu, dann machst du anhand dieses zwei verschiedene abarbeitungen der übergebenen Parameter
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 15.08.11 11:55 
Zitat:
Gibt es eine Möglichkeit, innerhalb einer Klasse mehrere verschiedene Konstruktoren zu definieren, die aber alle denselben Datentyp als Argument benötigen?


Nein. Bei gleichen Signaturen wird der Compiler schon streiken.


Zitat:
Wie genau geht eigentlich das Programm beim Erstellen einer Instanz einer Klasse vor, d.h. wenn ich keine Parameter an die Konstruktoren der Basisklasse weiterleite, wird dann einfach neben dem Kontruktor der abgeleiteten Klasse auch derjenige der Basisklasse (ohne Parameter) aufgerufen?


Wenn du aus dem Konstruktor deiner Klasse keinen Basisklassen Konstruktor aufrufst wird auch kein Basisklassen Konstruktor verwendet.
Exabyte Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 15.08.11 15:08 
Zitat:
Wenn du aus dem Konstruktor deiner Klasse keinen Basisklassen Konstruktor aufrufst wird auch kein Basisklassen Konstruktor verwendet.


Das verstehe ich nicht ganz :? . Ich habe einen Beispielcode geschrieben:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Mensch
    {
        public string Vorname { get; set; }
        public string Nachname { get; set; }
        
        public Mensch()
        {
            this.Vorname = "leer";
            this.Nachname = "leer";
        }
    }

    public class Schüler : Mensch
    {
        public string Schule { get; set; }
        
        public Schüler()
        {
            this.Schule = "leer";
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Schüler x = new Schüler();
            lblText.Text = "Vorname: " + x.Vorname + "\n" + "Nachname: " + x.Nachname + "\n" + "Schule: " + x.Schule + "\n";
        }
    }
}


Der angefügte Screenshot des Programms zeigt die Eigenschaften "Vorname" und "Nachname" der Instanz x der abgeleiteten Klasse. Damit "Vorname" und "Nachname" "leer" sein können, müsste doch der Basisklassenkonstruktor bei der Erstellung von x aufgerufen worden sein?
Einloggen, um Attachments anzusehen!
dark-destination1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: Mo 15.08.11 15:11 
unter konstruktor Kopf :base ruft den basiskonstruktor auf
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 15.08.11 15:35 
Offensichtlich habe ich gelogen.

Sauberer fände ich es trotzdem wenn man denn Basisklassen Konstruktor explizit angibt (auch wenn der Compiler denn selber dranzaubert)
ausblenden C#-Quelltext
1:
2:
3:
4:
public Schüler() : base()
{
  // blah
}
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 15.08.11 20:45 
Du kannst zwar nicht mehrere Methoden mit gleichen Parametern benutzen, aber du kannst einfach Standardwerte angeben und nur die gewünschten Parameter übergeben. Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
    private void test(int a = 0string b = ""int c = 0)
    {
        MessageBox.Show(c.ToString());
    }

    // Aufruf:
    test(c: 99);

Für diesen Beitrag haben gedankt: Exabyte