Laden...

Klasse nur innerhalb des namespace sichtbar machen

Erstellt von Usul vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.676 Views
U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren
Klasse nur innerhalb des namespace sichtbar machen

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?

P
157 Beiträge seit 2006
vor 17 Jahren

Hallo Usul,

wenn ich Dich richtig verstehe dann müsstest Du nur die Klasse 'Keks' als private definieren.

Gruß
purplestar

U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren

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?

4.506 Beiträge seit 2004
vor 17 Jahren

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!”

U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren

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!

175 Beiträge seit 2006
vor 17 Jahren

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? 😁

U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren

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.

175 Beiträge seit 2006
vor 17 Jahren

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 🙂

F
97 Beiträge seit 2006
vor 17 Jahren

ich würds mit



internal class keks
{
}


versuchen!!!

mfg flix

To Infinity and Beyond

175 Beiträge seit 2006
vor 17 Jahren

Original von felix_schmidt
ich würds mit

  
  
internal 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.

O
778 Beiträge seit 2007
vor 17 Jahren

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()
  {
  }

}

O
778 Beiträge seit 2007
vor 17 Jahren

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
      {
      }

   }
}

175 Beiträge seit 2006
vor 17 Jahren

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.

U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren

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.

U
Usul Themenstarter:in
40 Beiträge seit 2006
vor 17 Jahren

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.