Laden...

Inkonsistenten Zugriff vermeiden

Erstellt von Getränke Hoffmann vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.455 Views
G
Getränke Hoffmann Themenstarter:in
177 Beiträge seit 2006
vor 17 Jahren
Inkonsistenten Zugriff vermeiden

Folgendes Verhalten finde ich recht nervig:

ich habe eine Klasse, nennen wir sie ClassA.

Diese ist wie folgt definiert:


namespace MyApp
{
    class ClassA
    {
// usf

nun will ich innerhalb einer anderen Klasse (ClassB) diese ClassA verwenden:


namespace MyApp
{
    class ClassB
    {

         private ClassA clA;

         public ClassA ClA
         {
              get{return clA;}
          }
// usf.

Nun wird beim Versuch zu kopilieren angezeigt, dass es einen Fehler aufgrund von inkonsistentem Zugriff gäbe. Der Grund ist, dass in ClassB bei der Accessor Methode

public ClassA

steht. Das ist nur erlaubt, sofern ich ClassA selber mit


namespace MyApp
{
    public class ClassA
    {


deklariere. Gibt es da eine sinnvollere Lösung für?

6.862 Beiträge seit 2003
vor 17 Jahren

Nunja, du musst schon wissen was du willst. Wenn du deine Klasse als privat deklarierst(indem du sie nicht public machst) sie dann aber über nen Property öffentlich nach außen gibst(wo man sie ja nicht kennen sollte weil sie privat ist), dann stimmt irgendwas in der Logik nicht.

Baka wa shinanakya naoranai.

Mein XING Profil.

G
Getränke Hoffmann Themenstarter:in
177 Beiträge seit 2006
vor 17 Jahren

Die soll ja nur von aussen gelesen, nicht aber verändert werden können. Daher mache ich sie teilweise öffentlich, setze aber keine Set Property.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Getränke Hoffmann,

auch wenn sie nur von außen gelesen werden soll, muss sie außen bekannt sein.

herbivore

T
512 Beiträge seit 2006
vor 17 Jahren

Der Code der hier steht wird wunderbar funktionieren. Der Code der bei dir steht wird noch ein "public" vor dem "class ClassB" haben.

Ist auch logisch. Wenn du ClassB public definierst, können andere Assemblies sie verwenden. Andere Assemblies müssen dann auf alle Properties und Methoden zugreifen können. Um das zu können, müssen die Assemblies aber auch alle Typen der Parameter und Properties kennen. Wenn ClassA nicht public definiert ist, kennen die anderen Assemblies ClassA auch nicht.

Entweder du machst beide public, oder beide internal (= visibility Schlüsselwort weglassen)

e.f.q.

Aus Falschem folgt Beliebiges