Benutzer mit den meisten Antworten
Klassen verstecken

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