vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
not 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
Drapondur
Public 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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
allg. Frage: not public class842Micke03.01.05 17:12
Re: allg. Frage: not public class430cyberdarkness03.01.05 17:29
Re: allg. Frage: not public class413Micke03.01.05 17:38
Re: allg. Frage: not public class439Moderatorralf_oop03.01.05 17:32
not public class und das römische Weltreich 463Drapondur03.01.05 19:35
Re: not public class und das römische Weltreich 415Micke03.01.05 22:40
Re: not public class und das römische Weltreich430Drapondur04.01.05 01:25
"Credo, ut intelligam"459Micke05.01.05 11:53

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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