Entwickler-Ecke

Basistechnologien - Problem mit Konstruktoren


Xzeer - So 12.09.10 10:59
Titel: Problem mit Konstruktoren
Hi,

Es geht um diese Klasse:


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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
public class Ereignis
    {
        private Guid ereignisId;
        private Guid geräteId;
        private Guid aktionId;
        private Guid kundenId;
        private DateTime datum;
        private string vermerk;

        ////////////////////////////////////////////////////////
        /////////////// --> KONSTRUKTOR <-- ////////////////////
        ////////////////////////////////////////////////////////

        ///////////////// - Leer - ////////////////////////

        public Ereignis(Guid inEreignisId)
        {
            ereignisId = inEreignisId;
        }

        public Ereignis()
        {
            ereignisId = Guid.NewGuid();
        }

        ///////////////// - Pflichtfelder - ////////////////////////

        public Ereignis(Guid inEreignisId, Guid inGeräteId, DateTime inDatum)
        {
            ereignisId = inEreignisId;
            geräteId = inGeräteId;
            datum = inDatum;
        }

        public Ereignis(Guid inGeräteId, DateTime inDatum)
        {
            ereignisId = Guid.NewGuid();
            geräteId = inGeräteId;
            datum = inDatum;
        }

        ///////////////// - Vollständig - ////////////////////////

        public Ereignis(Guid inEreignisId, Guid inGeräteId, Guid inAktionId, Guid inKundenId, DateTime inDatum, string inVermerk)
        {
            ereignisId = inEreignisId;
            geräteId = inGeräteId;
            aktionId = inAktionId;
            kundenId = inKundenId;
            datum = inDatum;
            vermerk = inVermerk;
        }

        public Ereignis(Guid inGeräteId, Guid inAktionId, Guid inKundenId, DateTime inDatum, string inVermerk)
        {
            ereignisId = Guid.NewGuid();
            geräteId = inGeräteId;
            aktionId = inAktionId;
            kundenId = inKundenId;
            datum = inDatum;
            vermerk = inVermerk;
        }

        public Ereignis(Guid inEreignisId, Guid inGeräteId, Guid inAktionId, DateTime inDatum, string inVermerk)
        {
            ereignisId = inEreignisId;
            geräteId = inGeräteId;
            aktionId = inAktionId;
            datum = inDatum;
            vermerk = inVermerk;
        }

        public Ereignis(Guid inGeräteId, Guid inAktionId, DateTime inDatum, string inVermerk)
        {
            ereignisId = Guid.NewGuid();
            geräteId = inGeräteId;
            aktionId = inAktionId;
            datum = inDatum;
            vermerk = inVermerk;
        }
    }


Das ist der Fehler (Makiert ist Zeile 64):


Quelltext
1:
Der Typ "XADIS2010.Ereignis" definiert bereits einen Member namens "Ereignis" mit den gleichen Parametertypen.                    


Verstehe ich nicht, ich kann keinen doppelten Member finden!? Was mache ich denn da falsch?


Flitzs - So 12.09.10 11:28

Hallo!

Um eine Methode von einer anderen zu unterscheiden, wird ihre Signatur verwendet. Sie besteht aus dem Namen der Funktion und der Anzahl und Reihenfolge der Parameterdatentypen. Die Namen der einzelnen Parameter beeinflussen die Signatur nicht.

Daher hat


C#-Quelltext
1:
public Ereignis(Guid inGeräteId, Guid inAktionId, Guid inKundenId, DateTime inDatum, string inVermerk)                    


die selbe Signatur wie


C#-Quelltext
1:
public Ereignis(Guid inEreignisId, Guid inGeräteId, Guid inAktionId, DateTime inDatum, string inVermerk)                    


mfg Flitzs


Xzeer - So 12.09.10 12:29

okay, das klingt logisch...

muss ich jetzt also nur die datentypen-reihenfolge vertauschen, oder macht meine idee hinter den konstruktoren sowieso keinen sinn?


jaenicke - So 12.09.10 12:53

Da in C# keine optionalen Parameter möglich sind, bleiben nicht so viele Möglichkeiten. Die Parameter auszutauschen ist allerdings nicht besonders übersichtlich. Denn wenn der selbe Parameter mal z.B. als erster und mal als letzter kommt...

Eine andere Möglichkeit ist die, die Microsoft in der Windows API oft gegangen ist. Nämlich einen struct als Parameter mit den verschiedenen Daten und ggf. einem Flag, in dem angegeben wird, welche Daten gültig sind.

Ich denke das ist übersichtlicher als so viele Konstruktoren zu erstellen, die so ähnliche Signaturen haben.


Kha - So 12.09.10 13:34

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Da in C# keine optionalen Parameter möglich sind, [...]
http://msdn.microsoft.com/en-us/library/dd264739.aspx


danielf - So 12.09.10 13:44

Hallo,

seit es die Möglichkeit der vereinfachten Objekt Initialisierung gibt überlade ich die Konstruktoren nicht mehr.

http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_03_007.htm#mjb51cfa0979ea8fab5e39ddd0335e8219

Flexibler & fauler ;) geht es nicht

Gruß


jaenicke - So 12.09.10 15:03

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Da in C# keine optionalen Parameter möglich sind, [...]
http://msdn.microsoft.com/en-us/library/dd264739.aspx
Ah, gut zu wissen, da bin ich bei C# nicht so auf dem Laufenden. :mrgreen:

An parametrisierte Initialisierungen hatte ich nicht gedacht, das dürfte hier wohl die beste Lösung sein.