Hi
In Vb.Net gibt es Bestandteile aus denen verschiedene Typen aufgebaut werden können. Diese bezeichnet man als Member. Typen können teilweise wiederum Typen enthalten. Zusätzlich lassen sich sogenannte Custom-Member erzeugen, die aber meines Wissens nur in der Reflektion eingelesen bzw. ausgelesen werden können und generell nicht vom Editor unterstützt werden. Die folgende Liste zeigt die Basis aller Member und Typen, auf die die Anderen zurückgehen:
- Methods (= Methode, Function bzw. Sub)
- Fields (= Feld, Variablen, Konstanten)
- Types (= Typ)
Zusätzlich gibt es noch den Namensraum, in dem sich die Typen zusammenfassen lassen. Ein Typ kann eines der folgenden Modelle darstellen:
- Classes (=Klasse, enthält Methoden, Events, Properties, Felder, Konstruktoren, etc.)
- Value types (=Wertetyp, wird in VB.Net als Structure bezeichnet, erbt von System.ValueType, muss mindestens eine Variable enthalten und ist normalerweise nur einmal mit den gleichen Daten im Memory vertreten)
- Enumerations (=Auflistung, Auflistung von Konstanten):
- Interfaces (=Schnittstelle, Polymorphie bereitstellende Klassen mit abstrakten Methoden und Eigenschaften)
- Nested types (=verschachtelter Typ, das gleiche wie Klassen, nur dass sie innerhalb von Klassen vertreten sind)
- Delegaten (="Abgesandter", von der [Delegate]-Klasse abgeleitete Klassen, die einem Zeiger auf eine Methode ähnlich sind)
- in VB.Net Module (=Modul, Klassen mit statischen Membern)
Und es gibt folgende Member:
- Events (=Ereignis, Aufbau aus standardmäßig drei Methoden (RaiseEvent, AddHandler, RemoveHandler) und einer Variable, die eine Auflistung von Delegaten enthält)
oder
- Properties (=Eigenschaft, Aufbau aus standardmäßig einer oder zwei Methoden (Set, Get), unterstützt Parameter)
- Constructors (=Konstruktor, erste aufgerufene Methode einer Klasse)
- Variables (=Variable, Feld, kann mit Zugriffsmodifizerer versehen werden)
- Constants (=Konstante, Feld, kann mit Zugriffsmodifizerer versehen werden, immer statisch)
Anmerkungen
Zusätzlich können Methoden, Eigenschaften, Events und Variablen als Statisch deklariert werden (Shared-Modifizierer hinzufügen). Es gibt auch einen statischen Konstruktor, dem kein Parameter übergeben wird. Er dient zur Initialisierung der statischen Komponente einer Klasse oder Struktur. Als Modifizierer versteht man einen Zusatz, der vor einem Member angegeben wird. Mit ihm wird der Zugriff auf den Member und Typen reguliert (z.B. Zugriffsmodifizierer: Private = nur innerhalb des deklarierenden Typs kann auf den Member zugegriffen werden, Public = von überall ist der Zugriff möglich, Friend = nur innerhalb der Assembly kann auf den Member zugegriffen werden, Protected = innerhalb der Erbfolge kann auf diesen Member zugegriffen werden, Protected Friend= Innerhalb der Erbfolge und innerhalb des gleichen Assemblys).
Wertetypen, die in VB als Strukturen bezeichnet werden, müssen immer mindestens ein Feld besitzen, sonst kann nicht zwischen ihnen unterschieden werden, was spätestens von der Syntaxüberprüfung des Kompilers sowieso verhindert wird. Der Unterschied zwischen Function und Sub ist eigentlich nur der Rückgabetyp. Während Functions diesen besitzen müssen, ist er bei Subs weggelassen (eigentlich ist der Rückgabewert vom Typ System.Void, was auch bei GetType bzw. TypeOf zur Unterscheidung führt. Häufig heißen Subs in anderen Sprachen Voids).
In VB.Net wird die Erbfolge unterstützt. Sofern die Klasse nicht versiegelt wird (NotInheritable bei den Modifizierern), können also Klassen von diesem Typ abgeleitet werden. Klassen können auch als abstrakt gekennzeichnet werden (MustInherit); von dieser Klasse muss also geerbt werden. Generell gilt, dass eine Klasse nur von einer einzigen anderen Klasse erben kann. Das Problem der Mehrfachvererbung wird durch Polymorphie ergänzt, die ein Implementieren von Interfaces ermöglicht (Implements [Interface]). Interfaces sind generell mit einem I vor dem Namen gekennzeichnet (IEnumerable, ICollection). Dabei werden aber nicht komplette Methoden oder Eigenschaften zur Verfügung gestellt, sondern nur deren Deklaration. Somit kann eine Klasse so aussehen:
Standardmäßig sind Klassen vererbbar.
Für die Vererbung sind aber nicht nur Klassen elementar. Auch Methoden und Eigenschaften und deren Modifizierer spielen eine große Rolle. Innerhalb der Erbfolge werden beispielsweise alle Zugriffsmodifizierer behalten und nur jene, die direkt von Interfaces implementiert werden, können verändert werden. Um eine Methode "überschreibbar" zu machen, verwendet man entweder den Modifizierer "Overridable" (kann überschrieben werden) oder "MustOverride" (muss überschrieben werden), um die Vererbbarkeit einer Methode zu beenden und die Methode somit zu versiegeln, verwendet man den Modifizierer NotOverridable. Um die Methode schließlich in einer abgeleiteten Klasse zu überschreiben, wird der Overrides-Modifizierer angegeben.
In einer Klasse
In der abgeleiteten Klasse
Beim Implementieren von Interfaces ist zu beachten, dass der Zusatz Implements IMyInterface.MyMember benötigt wird. Wenn das Interface von einem anderen Interface erbt, müssen auch dessen Member implementiert werden und somit statt IMyInterface der Name des jeweiligen Interfaces.
Eigenschaften und Felder können auch noch mit ReadOnly versehen werden, die ein Schreiben von außerhalb des Konstruktors verhindern (dazu zählen auch Instanzierungen, die innerhalb der Zeile der Deklaration ablaufen, da diese auch im Konstruktor behandelt werden). Somit sind Felder und Eigenschaften mit diesem Modifizierer zwar lesbar, aber nicht beschreibbar. Zusätzlich gibt es für Eigenschaften noch den WriteOnly-Modifizierer, der nur das Setzen der Eigenschaft zulässt.
Wenn man auf dieses Konzept aufsetzt, kann man eine ganze Hierarchie erstellen. Alle Klassen erben beispielsweise vom Typ System.Object. Mithilfe der Vererbung wird ein mächtiges Werkzeug präsentiert, das Programme erweiterbar macht und ihre Verwendung findet man in vielen Bereichen wieder (PlugIn-Systeme, Spieleprogrammierung, uvm., aber auch bei Attributen, Ereignis-Argumenten oder Controls).
Wenn ihr Anregungen, Kritik habt oder einen Fehler entdeckt, könnt ihr das gerne posten. Wer Fragen hat, darf diese natürlich auch stellen und eventuell werden diese dann auch im Post ergänzt.
Gruß
~blaze~
In Vb.Net gibt es Bestandteile aus denen verschiedene Typen aufgebaut werden können. Diese bezeichnet man als Member. Typen können teilweise wiederum Typen enthalten. Zusätzlich lassen sich sogenannte Custom-Member erzeugen, die aber meines Wissens nur in der Reflektion eingelesen bzw. ausgelesen werden können und generell nicht vom Editor unterstützt werden. Die folgende Liste zeigt die Basis aller Member und Typen, auf die die Anderen zurückgehen:
- Methods (= Methode, Function bzw. Sub)
- Fields (= Feld, Variablen, Konstanten)
- Types (= Typ)
Zusätzlich gibt es noch den Namensraum, in dem sich die Typen zusammenfassen lassen. Ein Typ kann eines der folgenden Modelle darstellen:
- Classes (=Klasse, enthält Methoden, Events, Properties, Felder, Konstruktoren, etc.)
- Value types (=Wertetyp, wird in VB.Net als Structure bezeichnet, erbt von System.ValueType, muss mindestens eine Variable enthalten und ist normalerweise nur einmal mit den gleichen Daten im Memory vertreten)
- Enumerations (=Auflistung, Auflistung von Konstanten):
- Interfaces (=Schnittstelle, Polymorphie bereitstellende Klassen mit abstrakten Methoden und Eigenschaften)
- Nested types (=verschachtelter Typ, das gleiche wie Klassen, nur dass sie innerhalb von Klassen vertreten sind)
- Delegaten (="Abgesandter", von der [Delegate]-Klasse abgeleitete Klassen, die einem Zeiger auf eine Methode ähnlich sind)
- in VB.Net Module (=Modul, Klassen mit statischen Membern)
Und es gibt folgende Member:
- Events (=Ereignis, Aufbau aus standardmäßig drei Methoden (RaiseEvent, AddHandler, RemoveHandler) und einer Variable, die eine Auflistung von Delegaten enthält)
oder
VB.NET-Quellcode
- Public Custom Event MyCustomEvent As EventHandler
- AddHandler(ByVal value As EventHandler)
- 'EventHandler hinzufügen
- End AddHandler
- RemoveHandler(ByVal value As EventHandler)
- 'Eventhandler entfernen
- End RemoveHandler
- RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
- 'Event auslösen
- End RaiseEvent
- End Event
- Properties (=Eigenschaft, Aufbau aus standardmäßig einer oder zwei Methoden (Set, Get), unterstützt Parameter)
- Constructors (=Konstruktor, erste aufgerufene Methode einer Klasse)
- Variables (=Variable, Feld, kann mit Zugriffsmodifizerer versehen werden)
- Constants (=Konstante, Feld, kann mit Zugriffsmodifizerer versehen werden, immer statisch)
Anmerkungen
Zusätzlich können Methoden, Eigenschaften, Events und Variablen als Statisch deklariert werden (Shared-Modifizierer hinzufügen). Es gibt auch einen statischen Konstruktor, dem kein Parameter übergeben wird. Er dient zur Initialisierung der statischen Komponente einer Klasse oder Struktur. Als Modifizierer versteht man einen Zusatz, der vor einem Member angegeben wird. Mit ihm wird der Zugriff auf den Member und Typen reguliert (z.B. Zugriffsmodifizierer: Private = nur innerhalb des deklarierenden Typs kann auf den Member zugegriffen werden, Public = von überall ist der Zugriff möglich, Friend = nur innerhalb der Assembly kann auf den Member zugegriffen werden, Protected = innerhalb der Erbfolge kann auf diesen Member zugegriffen werden, Protected Friend= Innerhalb der Erbfolge und innerhalb des gleichen Assemblys).
Wertetypen, die in VB als Strukturen bezeichnet werden, müssen immer mindestens ein Feld besitzen, sonst kann nicht zwischen ihnen unterschieden werden, was spätestens von der Syntaxüberprüfung des Kompilers sowieso verhindert wird. Der Unterschied zwischen Function und Sub ist eigentlich nur der Rückgabetyp. Während Functions diesen besitzen müssen, ist er bei Subs weggelassen (eigentlich ist der Rückgabewert vom Typ System.Void, was auch bei GetType bzw. TypeOf zur Unterscheidung führt. Häufig heißen Subs in anderen Sprachen Voids).
In VB.Net wird die Erbfolge unterstützt. Sofern die Klasse nicht versiegelt wird (NotInheritable bei den Modifizierern), können also Klassen von diesem Typ abgeleitet werden. Klassen können auch als abstrakt gekennzeichnet werden (MustInherit); von dieser Klasse muss also geerbt werden. Generell gilt, dass eine Klasse nur von einer einzigen anderen Klasse erben kann. Das Problem der Mehrfachvererbung wird durch Polymorphie ergänzt, die ein Implementieren von Interfaces ermöglicht (Implements [Interface]). Interfaces sind generell mit einem I vor dem Namen gekennzeichnet (IEnumerable, ICollection). Dabei werden aber nicht komplette Methoden oder Eigenschaften zur Verfügung gestellt, sondern nur deren Deklaration. Somit kann eine Klasse so aussehen:
Standardmäßig sind Klassen vererbbar.
Für die Vererbung sind aber nicht nur Klassen elementar. Auch Methoden und Eigenschaften und deren Modifizierer spielen eine große Rolle. Innerhalb der Erbfolge werden beispielsweise alle Zugriffsmodifizierer behalten und nur jene, die direkt von Interfaces implementiert werden, können verändert werden. Um eine Methode "überschreibbar" zu machen, verwendet man entweder den Modifizierer "Overridable" (kann überschrieben werden) oder "MustOverride" (muss überschrieben werden), um die Vererbbarkeit einer Methode zu beenden und die Methode somit zu versiegeln, verwendet man den Modifizierer NotOverridable. Um die Methode schließlich in einer abgeleiteten Klasse zu überschreiben, wird der Overrides-Modifizierer angegeben.
In einer Klasse
In der abgeleiteten Klasse
Beim Implementieren von Interfaces ist zu beachten, dass der Zusatz Implements IMyInterface.MyMember benötigt wird. Wenn das Interface von einem anderen Interface erbt, müssen auch dessen Member implementiert werden und somit statt IMyInterface der Name des jeweiligen Interfaces.
VB.NET-Quellcode
- Public Interface IMyInterface
- Inherits IEnumerable
- Sub MyMethod()
- End Interface
- Public Class X
- Implements IMyInterface
- Public Sub MyMethod() Implements IMyInterface.MyMethod
- End Sub
- Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
- End Function
- End Class
Eigenschaften und Felder können auch noch mit ReadOnly versehen werden, die ein Schreiben von außerhalb des Konstruktors verhindern (dazu zählen auch Instanzierungen, die innerhalb der Zeile der Deklaration ablaufen, da diese auch im Konstruktor behandelt werden). Somit sind Felder und Eigenschaften mit diesem Modifizierer zwar lesbar, aber nicht beschreibbar. Zusätzlich gibt es für Eigenschaften noch den WriteOnly-Modifizierer, der nur das Setzen der Eigenschaft zulässt.
Wenn man auf dieses Konzept aufsetzt, kann man eine ganze Hierarchie erstellen. Alle Klassen erben beispielsweise vom Typ System.Object. Mithilfe der Vererbung wird ein mächtiges Werkzeug präsentiert, das Programme erweiterbar macht und ihre Verwendung findet man in vielen Bereichen wieder (PlugIn-Systeme, Spieleprogrammierung, uvm., aber auch bei Attributen, Ereignis-Argumenten oder Controls).
Wenn ihr Anregungen, Kritik habt oder einen Fehler entdeckt, könnt ihr das gerne posten. Wer Fragen hat, darf diese natürlich auch stellen und eventuell werden diese dann auch im Post ergänzt.
Gruß
~blaze~
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ () aus folgendem Grund: Edit1: kleine Formulierungsfehler ausgebessert, Zusatz eingefügt Edit2: weiteren Formulierungsfehler ausgebessert