0

Say I have three classes. A base class Person and two other classes (Employee and Manager) each inherits from Person.

Public Class Person
  Public Property Name As String
  Public Overridable ReadOnly Property Salary As Decimal
    Get
     Return 0
    End Get
  End Property

  Public Sub New()
  End Sub
  End Class

Class Employee:

Public Class Employee
Inherits Person
Overrides ReadOnly Property Salary As Decimal
  Get
   Return 100
  End Get
End Property

Sub New()
MyBase.New()
End Sub
End Class

Class Manager:

Public Class Manager
Inherits Person

Overrides ReadOnly Property Salary As Decimal
    Get
        Return 1000
    End Get
End Property
Sub New()
    MyBase.New()
End Sub
End Class

My problem is how to create a new Person(based on a ListBox) that can be either Person/Employeeor Manager and retrieve the Salary Property without going through Select Case or If-else in the ListBox1_SelectedIndexChanged event. To do this selection, I have added another class, named Identify, that takes the selected index of the Listbox and pass it to getProsonType method and return the selected category. Please look at my code below.

The form1 code looks like:

Public Class Form1
Private P As Identify

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles 
MyBase.Load
    ListBox1.Items.Add("Person")
    ListBox1.Items.Add("Employee")
    ListBox1.Items.Add("Manager")
End Sub

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As 
EventArgs) Handles ListBox1.SelectedIndexChanged
    P = New Identify(CType(ListBox1.SelectedIndex, PersonType))
    Dim PGeneral As Person
    PGeneral = P.GeneralPerson
    Label1.Text = PGeneral.Salary
 End Sub
End Class

I have assigned the three types to a public Enum PersonType just to restrict the selection.

Public Enum PersonType
  Person = 0
  Employee = 1
  Manager = 2
End Enum

The Identity Class looks like:

Public Class Identify
 Public Property PType As PersonType
 Public ReadOnly Property GeneralPerson As Person
    Get
        Return getProsonType(PType)
    End Get
 End Property

 Private Function getProsonType(ByVal SomeOne As PersonType) As Person
    Dim pp As Person

    Select Case SomeOne
        Case PersonType.Person
            pp = New Person()
        Case PersonType.Employee
            pp = New Employee()
        Case PersonType.Manager
            pp = New Manager()
    End Select
    Return GeneralPerson
   End Function

  Sub New(ByVal PersonType As PersonType)
    Me.PType = PersonType
  End Sub
 End Class

After running the project I get the error System.StackOverflowException. I am not sure if this is the cleanest or the correct way to do this and I looked in many places and reached this dead end! Please help me to correct this or find a better way. Thanks in advance.

SDrM
  • 1
  • 1
    Possible duplicate of [Create instance from string class name](https://stackoverflow.com/questions/21535205/create-instance-from-string-class-name) – GSerg Aug 01 '18 at 21:33
  • `Return GeneralPerson` should be `Return pp`, no? – LarsTech Aug 01 '18 at 21:34
  • Thank you so much it worked! However this scenario is an oversimplified one, I will use this in my actual case and hope it works too. Thanks again. – SDrM Aug 01 '18 at 21:41

0 Answers0