2012-12-20 2 views
1

다음 코드 검색분할 'RockPaperScissors.Paper'문자열은 '락'

player2.getWeapon.ToString()

반환하는

'RockPaperScissors.Rock' 

또는

'RockPaperScissors.Paper' 

또는

'RockPaperScissors.Scissors' 

저는 Rock, Paper 또는 Scissors와 같은 클래스 이름에만 관심이 있습니다. 이것을 어떻게 할 수 있습니까?

스플릿은 내 마음에 들었지만 그 최고인지는 확실하지 않았습니다.

답변

1

ToString 그냥 기본 Object 클래스에 의해 정의 된 일반 재정의 방법을 사용할 수 있습니다. 따라서 쉽게 재정의하여 원하는대로 되돌릴 수 있습니다. 예를 들어 :

Public Class Rock 
    Public Overrides Function ToString() As String 
     Return "Rock" 
    End Function 
End Class 

또는 당신이 그것을 구현하는 클래스를 강제하려는 경우, 당신은이 같은 기지 Weapon 수업 시간에 그것을 할 수 :

Public Class Weapon 
    Public Sub New(weaponName As String) 
     _weaponName = weaponName 
    End Sub 

    Private _weaponName As String 

    Public Overrides Function ToString() As String 
     Return _weaponName 
    End Function 
End Class 

Public Class Rock 
    Inherits Weapon 

    Public Sub New() 
     MyBase.New("Rock") 
    End Sub 
End Class 

을 양자 택일로, 당신이하지 않으면 생성자에서이 속성을 요구하려면 기본 클래스에 MustOverride Function GetWeaponName() As String 보호를 추가 한 다음 ToString에서 반환하면됩니다. 어느 쪽이든 파생 된 클래스는 ToString에 반환 될 수 있도록 이름을 제공해야합니다.

내가이 방법으로 권장하는 이유는이 문자열을 사용자에게 표시되는 설명으로 사용하고 있기 때문입니다. 그렇다면 실제로 원하는 클래스 이름이 아니라 무기에 대한 설명입니다. 지금까지 그들은 단지 똑같아 지지만, 논리적으로 말하자면, 항상 그런 경우는 아닙니다. 예를 들어, SuperDuperRock이라는 클래스가있는 경우 사용자에게 표시하려는 클래스는 아닙니다. 오히려 단어 사이에 공백이 있으면서 형식이 올바르게 지정되기를 원할 것입니다.

3

예, string.Split 적절한 방법이 될 것 같다 :

Dim tokens As String() = player2.getWeapon.ToString().Split("."c) 
Dim className As String = tokens.Last() ' or simply tokens(1) without Linq 

그러나 당신이 그것을 반환하는 재산으로 Weapon 클래스를 확장 할 수 있는지 직접 내가 그렇게 할 것입니다. 당신이 정말로 분할을 사용하지 않으려면

1

() 당신은 같이 IndexOf (더 성능이 좋은)

Dim className as String  
Dim weapon = player2.getWeapon.ToString() 
Dim pos as Integer = weapon.IndexOf("."c) 
if pos >= 0 Then 
    className = weapon.Substring(pos + 1) 
End if