Entwickler-Ecke
C# - Die Sprache - Sichtbarkeit von Classe
goose - Fr 13.04.07 01:54
Titel: Sichtbarkeit von Classe
Hallo,
eine kurze Frage zur sichtbarkeit von Klassen in C# bzw .NET
Also folgendes :
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:
| namespace GSE_Check { public class GSEArchiv { #region Class GSE public class GSE { public enum GSEState { GREEN, YELLOW, RED }; private GSEState m_State = GSEState.GREEN; public GSEState State { get { if (this.m_Remarks != String.Empty && this.m_State != GSEState.RED) this.m_State = GSEState.YELLOW; return m_State; } set { m_State = value; } }
private double m_hours = 0.00; public double Hours { get { return m_hours; } set { m_hours = value; } }
private string m_Name = String.Empty; public String Name { get { return m_Name; } set { m_Name = value; } }
private string m_Remarks = String.Empty; public string Remarks { get { return m_Remarks; } set { m_Remarks = value; } }
public GSE(string Name) { this.m_Name = Name; } }; #endregion Class GSE
private List<GSE> m_GSEList = new List<GSE>(); public GSE this[int index] { get { return m_GSEList[index]; } } public void AddGSE(string GSEName) { m_GSEList.Add(new GSE(GSEName)); }
public int Count { get { return m_GSEList.Count; } } }; } |
Hierbei kann man über
C#-Quelltext
1:
| GSEArchiv.GSE g = new GSEArchiv.GSE("test"); |
ein Objekt vom Typ GSE erstellen.
Wie kann ich das verhindern ?
Ich muss aber auch irgendwie noch darauf zugreifen können über den Indexer, das bitte nicht vergessen, denn das ist das Problem.
Ich bekomme, sobald ich die Klasse GSE private mache eine Fehlermeldung das die Klasse weniger zugreifbar ist. Ist ja auch so. Ich weiß nur nicht ob ich das jetzt so richtig mache oder ob das nicht geht oder ob ich einen Denkfehler habe irgendwo ?
Bitte um Hilfe !
Danke
Matthias
Christian S. - Fr 13.04.07 09:34
Das ist doch klar: Du hast einen Indexer mit Sichtbarkeit public vom Typ GSEArchiv.GSE. Wie soll der denn eine Klasse zurückliefern können, die weniger sichtbar ist?
goose - Sa 14.04.07 00:20
Hallo,
warum wiederholst Du was ich schon geschrieben hatte ?
Zitat: |
Hierbei kann man über
GSEArchiv.GSE g = new GSEArchiv.GSE("test"); ein Objekt vom Typ GSE erstellen.
|
Wie kann ich das verhindern ?
Das war die Frage !?
Bitte etwas genauer lesen ... Danke
Matthias
Christian S. - Sa 14.04.07 00:59
Entschuldige vielmals, dass ich eine Fehler gemacht habe, als ich Dir helfen wollte. Deine Reaktion ist in keiner Weise übertrieben und regt in hohem Maße dazu an, Dir weiterhin zu antworten.
goose - Sa 14.04.07 16:12
Hallo,
eine Antwort die mit
"Das ist doch klar ( gemeint war sicher du blödie ) .."
beginnt regt aber auch nicht wirklich dazu an hier weiterhin Fragen zu stellen.
Du wirst es nicht glauben aber es gibt durchaus Menschen
die, im Gegensatz zu Dir, noch einige Wissenslücken haben und vielleicht
auch mit C# erst angefangen haben.
Matthias
Christian S. - Sa 14.04.07 18:26
Lassen wir das, anscheinend haben wir gegenseitig unsere Antworten in den falschen Hals bekommen. Ich wollte keinesfalls sagen, Du seihst blöde. Sollte das so rübergekommen sein, entschuldige ich mich.
Nun zu Deinem Problem. Falls die Klasse später in einer eigenen Assembly steckt, könntest Du die Sichtbarkeit des Konstruktors von GSEArchive.GSE auf "assembly" setzen.
Wenn die Klasse nicht in einer separaten Assembly sein wird, fällt mir im Moment nur so etwas (einige Teile rausgekürzt):
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:
| public class GSEArchiv { private static GSE newGSE;
public class GSE { private string m_Name = String.Empty; public String Name { get { return m_Name; } set { m_Name = value; } }
public static void addNewGSE (string Name, GSEArchiv gsea) { gsea.AddGSE(new GSE(Name)); }
private GSE(string Name) { this.m_Name = Name; } };
private List<GSE> m_GSEList = new List<GSE>(); private void AddGSE(GSE gse) { m_GSEList.Add(gse); }
public void AddGSE(string GSEName) { GSE.addNewGSE(GSEName, this); } }; |
Schön ist's nicht, aber es funktioniert ;-)
Man kann aber natürlich immer noch an eine Instanz von GSEArchive.GSE kommen, indem eine GSE-Instanz der Liste hinzufügt und dann über den Indexer rausholt.
Kha - So 15.04.07 00:41
Wenn du die Verschachtelung genau umkehrst, kannst du den Kontruktor-Modifier von GSE auf private setzen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!