Search code examples
vb.netwinformsoopcompareto

Getting the error, 'compareTo' is not a member of 'RockPaperScissors.Weapons' in VB.NET


I'm new to programming and OOP so please forgive me for my lack of knowledge.

As part of my Rock, Paper and Scissors game I have a abstract superclass (Weapon) which has subclasses (Rock, Paper and Scissors) in VB.NET like:

    Public MustInherit Class Weapons

    Public Class Paper
        Inherits Weapons

        Public Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Paper Then
                Return 0
            ElseIf TypeOf Weapons Is Rock Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class

    Public Class Rock
        Inherits Weapons

        Public Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Rock Then
                Return 0
            ElseIf TypeOf Weapons Is Scissors Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class

    Public Class Scissors
        Inherits Weapons

        Public Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Scissors Then
                Return 0
            ElseIf TypeOf Weapons Is Paper Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class

End Class

Also have a superclass Player which has subclasses (PlayerComputerRandom and PlayerHumanPlayer) like:

Imports RockPaperScissors.Weapons

Public Class Player

    Private pName As String
    Private pNumberOfGamesWon As String
    Public pWeapon As Weapons

    Property Name() As String
        Get
            Return pName
        End Get
        Set(ByVal value As String)
            pName = value
        End Set
    End Property

    Property NumberOfGamesWon As String
        Get
            Return pNumberOfGamesWon
        End Get
        Set(ByVal value As String)
            pNumberOfGamesWon = value
        End Set
    End Property

    Property getWeapon As Weapons
        Get
            Return pWeapon
        End Get
        Set(ByVal value As Weapons)
            pWeapon = value
        End Set
    End Property

    Public Sub pickWeapon(ByVal WeaponType As String)
        If WeaponType = "Rock" Then
            pWeapon = New Rock()

        ElseIf WeaponType = "Paper" Then
            pWeapon = New Paper()

        Else
            pWeapon = New Scissors()

        End If

    End Sub

End Class

 Imports RockPaperScissors.Weapons

    Public Class PlayerComputerRandom
        Inherits Player

        Private Enum weaponsList
            Rock
            Paper
            Scissors
        End Enum

        Public Overloads Sub pickWeapon()

            Dim randomChoice = New Random()
            Dim CompChoice As Integer = randomChoice.Next(0, [Enum].GetValues(GetType(weaponsList)).Length)

            If CompChoice = "0" Then
                pWeapon = New Rock()

            ElseIf CompChoice = "1" Then
                pWeapon = New Paper()

            Else
                pWeapon = New Scissors()

            End If


        End Sub

    End Class




     Public Class PlayerHumanPlayer
        Inherits Player

    End Class

However, I am getting the error 'compareTo' is not a member of 'RockPaperScissors.Weapons'' when attempting to compare the results after the btnRock is clicked. The code is:

    Public Class GameForm

    Private Sub btnRock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRock.Click
        Dim player1 = New PlayerHumanPlayer()
        Dim player2 = New PlayerComputerRandom()

        player1.Name = "HumanPlayer"
        player1.pickWeapon("Rock")

        player2.Name = "Computer"
        player2.pickWeapon()

        Dim winner As Integer = player1.getWeapon().compareTo(player2.getWeapon())

        Select Case winner
            Case 1
                Console.WriteLine(player1.Name() + " wins!")
            Case -1
                Console.WriteLine(player2.Name() + " wins!")
            Case 0
                Console.WriteLine("Draw!")
        End Select

    End Sub
End Class

The line 'Dim winner As Integer = player1.getWeapon().compareTo(player2.getWeapon())' seems to be causing the problem.

Any idea how I can sort this, to ensure correct winner result is returned? Any help would be greatly appreciated.

Manys thanks in advance


Solution

  • The problem is that you are trying to Create a Base Class that needs to have a compareTo Function to inherit from but not completing the declaration. It needs to be something like this.

    Public MustInherit Class Weapons
        Public MustOverride Function compareTo(Weapons As Object) As Integer
    End Class
    

    Which will change your weapons classes to this.

    Public Class Paper
        Inherits Weapons
    
        Public Overrides Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Paper Then
                Return 0
            ElseIf TypeOf Weapons Is Rock Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class
    
    Public Class Rock
        Inherits Weapons
    
        Public Overrides Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Rock Then
                Return 0
            ElseIf TypeOf Weapons Is Scissors Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class
    
    Public Class Scissors
        Inherits Weapons
    
        Public Overrides Function compareTo(ByVal Weapons As Object) As Integer
            If TypeOf Weapons Is Scissors Then
                Return 0
            ElseIf TypeOf Weapons Is Paper Then
                Return 1
            Else
                Return -1
            End If
        End Function
    End Class
    

    See this MSDN link on MustInherit