none
Klassen verstecken RRS feed

  • Frage

  • Hallo

    Ich habe mal eine richtige Anfänger Frage zum Thema Klassen in VB.NET

    Ich habe eine Ordnerstruktur in meinem Klassenprojekt angelegt.
    Darin verwalte ich meine Daten.
    Als Bsp.: Ich habe einen Ordner "Base".

    Innerhalb dieses Ordners habe ich eine Klasse, die vereinfacht so aufgebaut ist:

    Namespace Base
      Public Class Power
        Public Property Value As Decimal
      End Class
    End Namespace

    Diese Klasse ist als Basisklasse für andere Klassen gedacht

    Wenn ich die DLL jetzt in einem Projekt einbinde, finde ich aber logischerweise diese Klasse unter:

    Base.Power

    Da diese Klasse aber eben, wie oben schon geschrieben eine Basisklasse sein soll, sollte sie natürlich nicht "sichtbar" sein, außerhalb meiner DLL. - Wie kann ich das verhindern?

    Habe versucht die Klasse schon als Private/Protected zu deklarieren, funktioniert aber nicht.

    DANKE für alle wertvollen Tipps in diese Richtung

    Montag, 17. August 2015 14:04

Antworten

  • Hallo zusammen,

    mal etwas allgemeines dazu wie die Vererbung in .NET funktioniert. Wenn du eine Klasse Base hast und eine Klasse PowerPlant davon erbt, so wird vorausgesetzt das überall dort wo man auf PowerPlant zugreifen kann, man auch auf Base zugreifen kann. Sonst bekommst du die Fehlermeldung mit dem inkonsistenten Zugriff (Ich gehe mal davon aus das das auch in VB.NET so heißt).

    Daher versteckt man Basisklassen auch nicht. Man packt sie oftmals noch nicht mal in andere Namespaces um dem Verwender der Bibliothek zu ermöglichen eigene Ableitungen zu erstellen. Das ist auch kein Problem, sofern du ordentlich OO programmiert hast.
    Denn dann ist es deinem Code egal welche Ableitung von Base sie als Instanz bekommt. Das was der Code braucht steckt in Base drin und nicht in PowerPlant o.ä. Will dein Code dagegen explizit eine Instanz von PowerPlant, so kann dieser auch voraussetzen das alle Member von PowerPlant und von Base da sind.

    Das heißt also, dass man Dinge immer mindestens genauso sichtbar machen muss wie die davon abhängigen Teile. Das gilt für Vererbungen wie auch für die Typen von Funktionsparametern, Eigenschaften, Rückgabewerten etc.

    Was du besonders in den App APIs häufig beobachten kannst ist die Tatsache, dass du fast immer Schnittstellen zurück bekommst. Das wäre zumindest bei Rückgabewerten und Eigenschaften ein Workaround um keine Klassen nach außen geben zu müssen.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Optic Gmbh Montag, 17. August 2015 15:59
    Montag, 17. August 2015 15:51
    Moderator

Alle Antworten

  • Hi,
    eine Klasse in einem Projekt (=Assembly) kannst Du aus einem anderen Projekt unerreichbar machen, indem Du die Klasse mit dem Zugriffsmodifizierer "Friend" kennzeichnest.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 17. August 2015 14:18
  • Hallo!

    Danke - ABER

    Wenn ich meine Klasse als Friend Bezeichne und versuche dann:

    Namespace PowerA
      Public Class PowerPlant
        Implements Base.Power
    
      End Class
    End Namespace

    Wobei eben Base.Power als Friend deklariert wurde, bekomme ich vom Kompiler die freundliche Information, dass eine als Friend gekennzeichnete Klasse nicht in einer öffentlichen Klasse zugänglich gemacht werde kann.

    Montag, 17. August 2015 15:02
  • Hi,
    Implements ist für die Implementierung von Interfaces vorgesehen, nicht für die Vererbung von Klassen.

    Ich habe nicht verstanden, was Du erreichen willst. Zu den Zugriffsmodifizieren schau mal hier.


    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Montag, 17. August 2015 15:10
  • Hallo zusammen,

    mal etwas allgemeines dazu wie die Vererbung in .NET funktioniert. Wenn du eine Klasse Base hast und eine Klasse PowerPlant davon erbt, so wird vorausgesetzt das überall dort wo man auf PowerPlant zugreifen kann, man auch auf Base zugreifen kann. Sonst bekommst du die Fehlermeldung mit dem inkonsistenten Zugriff (Ich gehe mal davon aus das das auch in VB.NET so heißt).

    Daher versteckt man Basisklassen auch nicht. Man packt sie oftmals noch nicht mal in andere Namespaces um dem Verwender der Bibliothek zu ermöglichen eigene Ableitungen zu erstellen. Das ist auch kein Problem, sofern du ordentlich OO programmiert hast.
    Denn dann ist es deinem Code egal welche Ableitung von Base sie als Instanz bekommt. Das was der Code braucht steckt in Base drin und nicht in PowerPlant o.ä. Will dein Code dagegen explizit eine Instanz von PowerPlant, so kann dieser auch voraussetzen das alle Member von PowerPlant und von Base da sind.

    Das heißt also, dass man Dinge immer mindestens genauso sichtbar machen muss wie die davon abhängigen Teile. Das gilt für Vererbungen wie auch für die Typen von Funktionsparametern, Eigenschaften, Rückgabewerten etc.

    Was du besonders in den App APIs häufig beobachten kannst ist die Tatsache, dass du fast immer Schnittstellen zurück bekommst. Das wäre zumindest bei Rückgabewerten und Eigenschaften ein Workaround um keine Klassen nach außen geben zu müssen.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Optic Gmbh Montag, 17. August 2015 15:59
    Montag, 17. August 2015 15:51
    Moderator
  • Danke, das ist eine sehr gute Erklärung.

    Dann werde ich nicht versuchen die "Basis-Klasse" zu verstecken.

    DANKE

    Montag, 17. August 2015 15:59