| |

VB.NET - Fortgeschrittenenot public class und das römische Weltreich  | |  | Autor: Drapondur | Datum: 03.01.05 19:35 |
| Hallo,
wenn Class "Katze" von Class "Säugetier" erbt, muss sie Public sein. Die Basisklasse verstecken zu wollen, würde keinen Sinn machen, da eine Katze ein Säugetier ist (vgl. die Welt ausserhalb des Computers) und somit alle öffentlichen und geschützten Eigenschaften/Methoden eines Säugetieres hat.
Da Du schon einmal Säugetiere und deren abgeleitete Klassen genommen hast, nehmen wir zur Illustration folgende Anwendung "Antikes Rom" an:
A. Eine nicht instantiierbare Klasse Säugetiere, mit der Methode "SäugeJunges(jungTier as SäugeTier)", da ja alle dauerhaft funktionsfähigen Säugetierweibchen eine solche Methode haben müssen, wenn Sie Nachwuchs haben sollen. Der Methode wird ein x-beliebiges Säugetier übergeben, dass dann gesäugt wird.
B. Eine Klasse "Wolf" die von "SäugeTier" erbt. Von dieser Klasse gebe es eine Instanz namens "Wölfin" und eine Instanz namens "Wolfjunges". Die Methode SäugeJunges sei überschattet, sodass die Wölfin nur Wolfsjunge säugt, andere Säuger aber frisst.
C. Eine Klasse Mensch (auch von Säugetier abgeleitet) mit drei Instanzen namens "Romulus", "Remus" und "Drapondur"
Rufen wir wölfin.SäugeJungtier(wolfsjunges) auf, wird das Wolfsjunge ernährt. Rufen wir aber wölfin.SäugeJungtier(drapondur) auf, wird Drapondur, weil er kein Wolf ist, gefressen.
Nun greifen aber die Götter ein und "verwandeln" mit Ctype die Wölfin in ein Säugetier, übergeben Romulus und Remus zum säugen. Weil die Wöflin nun aber nicht als Wolf, sondern als Säugetier angesprochen wird, werden die beiden ernährt. Das römische Weltreich ist gerettet.
Aus der Sicht des Weltenschöpfers (Programm-Designers) ist das weniger aufwändig als eine Schnittstellenlösung, da er den meisten Code wiederverwenden kann. Wenn man jedoch ein Vererbungsdesign verwendet, ist die Basisklasse selbst ein "sinnvoller Einstiegspunkt", da alle Objekte abgeleiteter Klassen auch Objekte der Basisklasse sind, ebenso wie bestimmte Wölfe und bestimmte Menschen eben Säugetiere sind.
Will man die Säugetier-Methoden jedoch zum Verschwinden bringen, bleibt einem nur der Weg über die von Ralf beschriebene Schnittstellen-Lösung.
Zu Ralf's Signatur "Bücher bringen das Basis-Wissen. Feinheiten durch Bücher ? - never !": Zum Thema "Gattungs-Art-Logik" vgl. die Bücher des "Organon" (Aristoteles) und die darauf aufbauende Scholastische Philosophie
Ciao
DrapondurPublic MustInherit Class Säugetier
Private myName$
Private myIsFemale As Boolean
Private myAge As Single
Protected Sub New(ByVal name$, ByVal isFemale As Boolean)
MyBase.New()
myName = name
myIsFemale = isFemale
End Sub
Public ReadOnly Property Name$()
<DebuggerStepThrough()> Get
Return myName
End Get
End Property
Public ReadOnly Property IsFemale() As Boolean
<DebuggerStepThrough()> Get
Return myIsFemale
End Get
End Property
Public Sub SäugeJungtier(ByVal jungTier As Säugetier)
If Not myIsFemale Then
Throw New ApplicationException("Männchen können nicht säugen.")
End If
Console.WriteLine("Säugetier """ & Me.Name _
& """ ernährt Jungetier """ & jungTier.Name & """")
End Sub
End Class
Public Class Wolf
Inherits Säugetier
Public Sub New(ByVal name$, ByVal isFemale As Boolean)
MyBase.New(name, isFemale)
End Sub
Public Shadows Sub SäugeJungtier(ByVal jungWolf As Säugetier)
If TypeOf jungWolf Is Wolf Then
MyBase.SäugeJungtier(jungWolf)
Else
Console.WriteLine("Der Wolf """ & Me.Name & _
""" frisst " & jungWolf.Name)
End If
End Sub
End Class
Public Class Mensch
Inherits Säugetier
Public Sub New(ByVal name$, ByVal isFemale As Boolean)
MyBase.New(name, isFemale)
End Sub
End Class
Public Class Starter
Public Shared Sub Main()
Dim wölfin As New Wolf("Wölfin", True)
Dim wolfsjunges As New Wolf("Wolfsjunges", True)
Dim romulus As New Mensch("Romulus", False)
Dim remus As New Mensch("Remus", False)
Dim drapondur As New Mensch("Drapondur", True)
wölfin.SäugeJungtier(wolfsjunges)
wölfin.SäugeJungtier(drapondur) 'Autsch
CType(wölfin, Säugetier).SäugeJungtier(romulus)
CType(wölfin, Säugetier).SäugeJungtier(remus)
Console.ReadLine()
End Sub
End Class |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevZIP40 Pro DLL 
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|