Hallo,
ich habe mir heute nochmal die Zugriffsmodifizierer in VB.NET angeschaut. Ich habe ein paar Fragen (1.1 - 1.4) und wäre erfreut, wenn ihr sie mir beantworten könntet. Unten habe ich einen Text zu Vererbung geschrieben. Könntet ihr über den Code schauen, bitte?
1) Als Erstes zu
1.1.) Zu
1.2)
1.3) Man hat mir hier im Forum einst gesagt, dass es
1.4) Hat jemand bitte ein konkretes Anwendungsbeispiel (vielleicht aus dem Leben), wofür man
Hier der Code zu den Fragen 1.1 bis 1.4
und
2.) Vererbung
Hiermit komme ich soweit klar. Angenommen, eine Sache A ist so allgemein, dass man darauf aufbauen bzw ableiten muss. Zum Beispiel sagt „Ich spiele ein Instrument“ viel zu wenig aus. Man muss von der Klasse
Oder das Beispiel, was wir hier schon hatten:
Und jede erbende Klasse bringt dann weitere Eigenschaften mit sich.
Aufgrunddessen, dass vererbt und geerbt werden muss, muss es eine zu überschreibende Prozedur geben, wenn man zum Beispiel den Namen haben will. Wenn man es so ausdrücken möchte: Lebewesen ist sooo allgemein, dass man nicht nach
Die Klassen, die MustInherit im Kopf stehen haben, nennt man dann abstrakt.
Class Lebewesen
in Form1.vb
ich habe mir heute nochmal die Zugriffsmodifizierer in VB.NET angeschaut. Ich habe ein paar Fragen (1.1 - 1.4) und wäre erfreut, wenn ihr sie mir beantworten könntet. Unten habe ich einen Text zu Vererbung geschrieben. Könntet ihr über den Code schauen, bitte?
1) Als Erstes zu
Friend
, Protected Friend
und Private Protected
.1.1.) Zu
Protected
weiß ich bereits: Eine protected Variable ist nicht sichtbar, außer für eine erbende Klasse. Ich kann in Form1.vb nicht schreiben: TC2._protected
. Ich kann aber die Prozedur inkrementieren()
aufrufen, welche _protected
ausgibt. Aber dann kann ich ja doch wieder auf sie zugreifen. Kann jemand erklären, wozu das gut ist?1.2)
Friend
bedeutet, die Variable ist innerhalb des Projektes zugreifbar, aber nicht projekt- / assemblyübergreifend. Was bedeutet das? Ich weiß aus der C++-Welt, wenn die Klasse TestClass
private
wäre (was in vb nicht geht), könnte Form1.vb
das trotzdem sehen. Aber wieso das Wort assemblyübergreifend? 1.3) Man hat mir hier im Forum einst gesagt, dass es
Private Protected
gäbe. Allerdings bietet mir Visual Studio das nicht an. Ist das so richtig?1.4) Hat jemand bitte ein konkretes Anwendungsbeispiel (vielleicht aus dem Leben), wofür man
Protected Friend
benötigt?Hier der Code zu den Fragen 1.1 bis 1.4
VB.NET-Quellcode
und
VB.NET-Quellcode
- Imports Microsoft.VisualBasic.ControlChars
- Public Class TestClass
- Private eins As Integer = 1 'nicht aus FormMain sichtbar
- Public zwei As Integer = 2 'aus FormMain sichtbar
- Protected _protected As Integer = 3 'nicht sichtbar, außer für erbende Klasse. Ich kann in Form1.vb nicht schreiben: TC2._protected. Ich kann aber die Prozedur inkrementieren() aufrufen, welche _protected ausgibt.
- Friend vier As Integer = 4 'aus FormMain sichtbar, jedoch nicht projektübergreifend?
- Protected Friend fuenf As Integer = 5 'Beispiel
- End Class
- Public Class TestClass2 : Inherits TestClass
- Public Sub inkrementieren()
- _protected += 1
- MessageBox.Show($"Variable '_protected' kann sowohl gelesen als auch bearbeitet werden.{NewLine}{_protected}", "funktioniert", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End Sub
- End Class
2.) Vererbung
Hiermit komme ich soweit klar. Angenommen, eine Sache A ist so allgemein, dass man darauf aufbauen bzw ableiten muss. Zum Beispiel sagt „Ich spiele ein Instrument“ viel zu wenig aus. Man muss von der Klasse
Instrument
erben und kann dann ein Piano
oder Akkordeon
erzeugen. Grüße gehen raus an CodeBeauty .Oder das Beispiel, was wir hier schon hatten:
Lebewesen
ist viel zu allgemein. Ich baue daher eine Systematik auf: Lebewesen
→ Säugetiere
→ Paarhufer
→ Echte Schweine
→ Hausschwein
. Wobei ich natürlich auch die Klasse Paarhufer
hernehmen kann, um daraus ein Kamel
zu machen. Und jede erbende Klasse bringt dann weitere Eigenschaften mit sich.
Aufgrunddessen, dass vererbt und geerbt werden muss, muss es eine zu überschreibende Prozedur geben, wenn man zum Beispiel den Namen haben will. Wenn man es so ausdrücken möchte: Lebewesen ist sooo allgemein, dass man nicht nach
Lebewesen.Name
fragen darf. Daher nennt man das pure-virtual
. Habe ich das unten richtig gemacht? (Wenn man allerdings ein Beispiel hat, wo es doch genehmigt ist, kann man Overridable
schreiben, so dass man sich es aussuchen kann, ob man das möchte oder nicht)Die Klassen, die MustInherit im Kopf stehen haben, nennt man dann abstrakt.
Class Lebewesen
VB.NET-Quellcode
- Public MustInherit Class Lebewesen
- Public Alter As Integer
- Public Name As String = ""
- Public MustOverride Sub Nenne_deinen_Namen() ' pure-virtual gewollt
- End Class
- Public MustInherit Class Saeugetiere : Inherits Lebewesen
- Public kann_fliegen As Boolean
- Public Felllaenge As Single 'in Prozent des Möglichen
- Public Anzahl_der_Zaehne As Integer
- Public Koerpertemperatur As Integer 'in °C
- End Class
- Public MustInherit Class Paarhufer : Inherits Saeugetiere
- Public ist_nachtaktiv As Boolean
- Public Structure Waffenarten
- Public Property hat_Hoerner As Boolean
- Public Property hat_Stosszaehne As Boolean
- Public Property hat_Klauen As Boolean
- End Structure
- End Class
- Public MustInherit Class Echte_Schweine : Inherits Paarhufer
- Public hat_Bart As Boolean
- End Class
- Public Class Hausschwein : Inherits Echte_Schweine
- Public dieses_wird_im_Stall_gehalten As Boolean
- Public WA As Waffenarten 'Instanz erzeugen
- Public Sub New(ByVal uebergebenesAlter As Integer, ByVal imStall As Boolean, ByVal Name As String)
- Me.Alter = uebergebenesAlter
- Me.kann_fliegen = False
- Me.Felllaenge = 0.2F
- Me.Anzahl_der_Zaehne = 44
- Me.Koerpertemperatur = 39
- Me.ist_nachtaktiv = False
- Me.dieses_wird_im_Stall_gehalten = imStall
- Me.WA.hat_Hoerner = False
- Me.WA.hat_Stosszaehne = False
- Me.WA.hat_Klauen = False
- Me.hat_Bart = False
- Me.Name = Name
- End Sub
- Public Overrides Sub Nenne_deinen_Namen()
- MessageBox.Show($"{Name} is its name.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
- End Sub
- End Class
in Form1.vb