tags:

views:

78

answers:

1

I'm trying to do something here with VB that I guess I'm not understanding how to do it exactly. Sorry I'm not that good at OOP.

I have a number of things I'm creating and they have two values - parent name and child name (yes, actual people!).

So it would be like this:

Public Class Child
    Public Property ParentName As String
    Public Property ChildName As String
End Class

And then:

Public Class Parent
    Public Property ParentName As String
    Public Property ChildName() As String
End Class

Then I need to add these to a Parents class where a Parent can have one or more children.

I start by adding a Child. If that child's Parent name already exists, just add the Child's name to that parent, but if it doesn't exist, create a new parent (with that child). Then add all parents to a collection of parents (with their 1 or more children).

A resulting list would look something like this:

Parents:

  1. Parent: Jonathan Murry
    1. Child: Carl Murry
  2. Parent: Kathleen Anderson
    1. Child: Steven Anderson
    2. Child: Deborah Anderson
    3. Child: Thomas Anderson
  3. Parent: Xu Jing
    1. Child: Liu Ming
    2. Child: Liu Ning

(note on the last one - the parent/child last names don't need to match - in this case, the children take the father's last name instead of the mother's, but we don't list the father).

How would I create these type of classes so that I can add children to a parent, add a parent to parents and then ensure it is querable with something like Linq?

Thx in advance.

+5  A: 

Since all of them are persons, perhaps there should instead be a Person class. Each person may a Mother, a Father and a collection of Children. That way you can create graphs over several generations and with all sorts of constellations.

Public Class Person
    Public Property Name As String
    Public Property Mother As Person
    Public Property Father As Person
    Public Property Children As List(Of Person)
End Class

Update
Here is a fuller (and somewhat reworked) example that perhaps can help to shed some light:

The Person class, slightly changes (replaced Mother / Father with Parent, made the Children property `ReadOnly´)

Public Class Person
    Public Property Name As String
    Public Property Parent As Person
    Private _children As New List(Of Person)

    Public ReadOnly Property Children As List(Of Person)
        Get
            Return _children
        End Get
    End Property

End Class

And a sample program creating a Person list, and posing a LINQ query.

Module Program
    Sub Main()
        Dim persons As IEnumerable(Of Person) = GetPersonGraph()
        Dim jonathansChildren As IEnumerable(Of Person)
        jonathansChildren = persons.Where(Function(p) _
                                Not p.Parent Is Nothing _
                                AndAlso p.Parent.Name = "Jonathan Murphy")

        For Each child As Person In jonathansChildren
            Console.WriteLine(child)
        Next
    End Sub


    Function GetPersonGraph() As IEnumerable(Of Person)
        Dim result As New List(Of Person)
        Dim parent As Person
        Dim child As Person

        parent = New Person()
        parent.Name = "Jonathan Murphy"
        result.Add(parent)

        child = New Person()
        child.Name = "Carl Murry"
        child.Parent = parent
        parent.Children.Add(child)
        result.Add(child)

        Return result
    End Function
End Module
Fredrik Mörk
+1, you're right on target! I would start with a *person* object, too, then figure out the relationships between people.
Treb
I agree with your answer, if it's only biological parents that matter. Though if it's any kind of business software, where it's probably the legal parents that's needed, it might be safer to remove the `Mother` and `Father` properties and instead have a `Parents` list property (could be step/foster/adoptive parents of either sex, and might possibly be more than 2 parents all in all).
ho1
Not really sure how this helps me with the request. Also, I don't need mothers and fathers seperated.
WinnerWinnerChickenDinner
@ChickenDinner: I update the answer with some (hopefully) clarifications
Fredrik Mörk
This is super! just what I was looking for!
WinnerWinnerChickenDinner