none
einen Typ von einer Klasse auf die Unterklasse ändern RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Basis-Klasse Person und verschiedene abgeleitete Klassen wie z.B. Student. Wenn die Person Hans Schmidt sich in einer Universität immatrikuliert wird diese Person ein Student. Wie kann ich mit VB.Net diese Umwandlung durchführen?

    Vielen Dank

    Samstag, 8. Juni 2019 07:23

Antworten

  • Über einen Cast bekommst du das meines Wissens nach nicht hin; du musst dir letztlich eine neue Instanz von Student erstellen und die Eigenschaften aus Person dann in die neue Instanz 'manuell' übernehmen (in meinem Beispiel als Methode in Student, da Student ja auf jeden Fall Person kennt):

    Public Class Person
        Public Property Name As String
        ' more person properties
    End Class
    
    Public Class Student
        Inherits Person
        Public Property Studienbeginn As DateTime
        ' more student properties
    
        Public Sub FromPerson(p as Person)
            Name = p.Name
            ' more person property mappings
    
            Studienbeginn = DateTime.MinValue
            ' more student property inits
        End Sub
    
    End Class
    
    Public Class fooClass
        Public Sub Convert()
            Dim p1 As New Person
            p1.Name = "Hans Schmidt"
    
            Dim s1 As New Student
            s1.FromPerson(p1)
    
        End Sub
    End Class

    Bei komplexen Objekten lohnt sich dann ggf. auch der Einsatz von Automapper.

    Dienstag, 11. Juni 2019 06:28
  • Hallo Rainer,

    zwar hängt es letztendlich vom Einsatzfeld ab. Aber generell kann eine Person verschiedene Funktionen und Identitäten annehmen, als Student, Rentner, der studieren könnte, (Ehe-)Partner, unterschiedlichste Haupt- und Nebenberufe uam. nebeneinander und zu gleicher Zeit repräsentieren.

    Deswegen kann es sich empfehlen keine direkte Ableitung von einer Basis-Klasse vorzunehmen. Eine Möglichkeit wäre eine Schnittstelle (Interface) Person zu definieren und diese den jeweiligen implementierenden Klassen zuzuordnen. Da eine Klasse mehrere Schnittstellen verwenden kann, sind auch komplexere Verhältnisse abbildbar.

    Eine anderer klassischer Weg wäre das Kompositum.

    Eine direkte "Umwandlung" wäre in keine Falle möglich. Wie Christoph schon skizziert hat, wird man eine Konvertierung bzw. eine Erzeugung einer neuen Klasse-Instanz, die z. B. die Basisklasse im Konstruktor übernimmt, vornehmen müssen.

    Gruß Elmar

    Dienstag, 11. Juni 2019 19:01

Alle Antworten

  • Hallo,

    ich programmiere zwar nicht in VB, aber es ist doch im Grunde überall gleich.

    Du könntest einfach eine neue Variable vom Typ Student erstellen und einfach Hans daran zuweisen.

    Person hans
    Student hans_als_student
    hans_als_student = hans
    Gruß Guido


    Edit: einen direkten cast "(Student)hans" gibt es nicht, da u.a. Speicher fehlt (Person ist nur ein Teil von Student). Es geht nur der cast "(Person)hans_als_student". Du musst also über die neue Variable gehen.
    Dienstag, 11. Juni 2019 06:20
  • Über einen Cast bekommst du das meines Wissens nach nicht hin; du musst dir letztlich eine neue Instanz von Student erstellen und die Eigenschaften aus Person dann in die neue Instanz 'manuell' übernehmen (in meinem Beispiel als Methode in Student, da Student ja auf jeden Fall Person kennt):

    Public Class Person
        Public Property Name As String
        ' more person properties
    End Class
    
    Public Class Student
        Inherits Person
        Public Property Studienbeginn As DateTime
        ' more student properties
    
        Public Sub FromPerson(p as Person)
            Name = p.Name
            ' more person property mappings
    
            Studienbeginn = DateTime.MinValue
            ' more student property inits
        End Sub
    
    End Class
    
    Public Class fooClass
        Public Sub Convert()
            Dim p1 As New Person
            p1.Name = "Hans Schmidt"
    
            Dim s1 As New Student
            s1.FromPerson(p1)
    
        End Sub
    End Class

    Bei komplexen Objekten lohnt sich dann ggf. auch der Einsatz von Automapper.

    Dienstag, 11. Juni 2019 06:28
  • Hallo Rainer,

    zwar hängt es letztendlich vom Einsatzfeld ab. Aber generell kann eine Person verschiedene Funktionen und Identitäten annehmen, als Student, Rentner, der studieren könnte, (Ehe-)Partner, unterschiedlichste Haupt- und Nebenberufe uam. nebeneinander und zu gleicher Zeit repräsentieren.

    Deswegen kann es sich empfehlen keine direkte Ableitung von einer Basis-Klasse vorzunehmen. Eine Möglichkeit wäre eine Schnittstelle (Interface) Person zu definieren und diese den jeweiligen implementierenden Klassen zuzuordnen. Da eine Klasse mehrere Schnittstellen verwenden kann, sind auch komplexere Verhältnisse abbildbar.

    Eine anderer klassischer Weg wäre das Kompositum.

    Eine direkte "Umwandlung" wäre in keine Falle möglich. Wie Christoph schon skizziert hat, wird man eine Konvertierung bzw. eine Erzeugung einer neuen Klasse-Instanz, die z. B. die Basisklasse im Konstruktor übernimmt, vornehmen müssen.

    Gruß Elmar

    Dienstag, 11. Juni 2019 19:01