Hi,
ich habe in meinen Projekt einen Ordner "Komponente" indem sich die Klassen "Bla" und "Keks" befinden. Bla benutzt Keks. Allerdings moechte ich, dass von aussen nur Bla genutzt werden kann. Also Keks sollte nicht von aussen gesehen werden koennen. Ist dies moeglich?
Hallo Usul,
wenn ich Dich richtig verstehe dann müsstest Du nur die Klasse 'Keks' als private definieren.
Gruß
purplestar
Original von purplestar
Hallo Usul,wenn ich Dich richtig verstehe dann müsstest Du nur die Klasse 'Keks' als private definieren.
Gruß
purplestar
man kann keine klasse als private definieren (ausser vielleicht innere klassen).
was ich suche ist ein "internal" schluesselwort, was aber auf namespace-ebene gilt und nicht auf assembly-ebene. bei java gibts das: wenn dort klassen nicht public sind, so koennen sie nur von klassen im selben paket gesehen werden. was ist das c#-aequivalent?
Hallo Usul,
solch einen Ersatz gibt es leider nicht. Internal bezieht sich immer auf die Assembly, und nicht auf den Namespace.
Um Klassen sichtbar/und unsichtbar gegenüber anderen zu machen, sollte man den Konstruktor mit den entsprechenden Modifizierern deklarieren.
Assemblyübergreifend hilft leider wirklich nur ein "public".
Gruß
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Original von norman_timo
Um Klassen sichtbar/und unsichtbar gegenüber anderen zu machen, sollte man den Konstruktor mit den entsprechenden Modifizierern deklarieren.
Ja aber wie soll das gehen? Wie kann ich den nur bestimmten Klassen (wie in meinem Beispiel Bla) erlauben anderen Klassen zu instanziieren (wie in meinen Beispiel Keks) ? Ich glaube das geht nicht ueber den Konstruktor!
Was ist denn der Sinn hinter deinem Vorhaben? Derjenige der Zugriff auf deinen Assembly-Code hat, kann auch locker seine Klasse in dem besagten Ns platzieren und kann damit deine Klasse instanzieren (ich meine: wenns das gäbe was du suchst 😉 )
Und demjenigen der keinen Zugriff auf deine Sources hat, kannst du den Zugriff über "internal" verweigern...
Oder überseh ich da ein Anwendungsfall? 😁
Original von dani.net
Was ist denn der Sinn hinter deinem Vorhaben? Derjenige der Zugriff auf deinen Assembly-Code hat, kann auch locker seine Klasse in dem besagten Ns platzieren und kann damit deine Klasse instanzieren (ich meine: wenns das gäbe was du suchst 😉 )Und demjenigen der keinen Zugriff auf deine Sources hat, kannst du den Zugriff über "internal" verweigern...
Oder überseh ich da ein Anwendungsfall? 😄
Hmm, guter Einwand! Aber es waere halt auch schoen, den Zugriff innerhalb eines Assemblies einschränken zu können. Ist ja auch blöd, für jedes namespace was eine "Hilfsklasse" beinhaltet, die nur von Klassen innerhalb des namespace verwendet werden kann, eine eigene DLL anzulegen.
Mmh also ich seh's nicht 😁
Bei Namespaces gehts nicht drum, Klassen voneinander zu schützen. Und wie schon gesagt, auch wenn du es könntest, würde es dir nichts bringen, da dieser "Schutz" sogar meine Putzfrau "hacken" könnte 🙂
ich würds mit
internal class keks
{
}
versuchen!!!
mfg flix
To Infinity and Beyond
Original von felix_schmidt
ich würds mitinternal class keks { }
versuchen!!!
mfg flix
Du hast den Thread nicht wirklich gelesen oder? 🤔
internal schränkt den Zugriff auf Klassen der selben Assembly ein, Usul möchte das aber auf Namespace-Ebene.
Ja aber wie soll das gehen? Wie kann ich den nur bestimmten Klassen (wie in meinem Beispiel Bla) erlauben anderen Klassen zu instanziieren (wie in meinen Beispiel Keks) ? Ich glaube das geht nicht ueber den Konstruktor!
Geht ja wohl!
public class keks
{
internal keks()
{
}
}
Zweite Variante (Bla und auch wirklich nur Bla hat Zugriff auf Keks):
public class Bla
{
private class keks:Bla
{
public keks() // public oder internal ist in dem Fall egal
{
}
}
}
Original von onlinegurke
Ja aber wie soll das gehen? Wie kann ich den nur bestimmten Klassen (wie in meinem Beispiel Bla) erlauben anderen Klassen zu instanziieren (wie in meinen Beispiel Keks) ? Ich glaube das geht nicht ueber den Konstruktor!
Geht ja wohl!
public class keks { internal keks() { } }
Also ich weiss ja nicht was ihr für ein .NET benutzt, aber bei meinem hat das internal auch bei geschachtelten Klassen den gleichen Effekt... 😉
Edit: Nach deinem Edit gehts auch im selben Namespace nicht mehr... was du machst ist einfach eine private geschachtelte Klasse, die nur für die äussere Klasse sichtbar ist.
Original von onlinegurke
Ja aber wie soll das gehen? Wie kann ich den nur bestimmten Klassen (wie in meinem Beispiel Bla) erlauben anderen Klassen zu instanziieren (wie in meinen Beispiel Keks) ? Ich glaube das geht nicht ueber den Konstruktor!
Geht ja wohl!
public class keks { internal keks() { } }
ne das geht nicht, es koennen immer noch alle klassen im selben assembly keks instanzieren, egal in welchem namespace sie sich befinden.
Edit:
Deine zweite Loesung ist auch nicht schoen, da Keks ja auch von anderen Klassen innerhalb des namespace verwendet koennen sollen soll. 😦
Edit2: Trotzdem schonmal danke an alle Antworter! Ich werde wohl auf DLL auslagern.