1

次のコード

player2.getWeapon.ToString()

戻り値

'RockPaperScissors.Rock'

また

 'RockPaperScissors.Paper'

また

'RockPaperScissors.Scissors'

クラス名、つまりロック、ペーパー、はさみに興味があります。どうすればこれを達成できますか?

スプリットが私の頭に浮かんだものでしたが、それが最高かどうかはわかりませんでした。

4

3 に答える 3

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しかし、それを直接返すプロパティを使用してクラスを拡張できる場合は、それを実行します。

于 2012-12-20T23:11:24.717 に答える
1

本当に Split() を使用したくない場合は、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
于 2012-12-20T23:13:17.903 に答える
1

ToStringObject基本クラスによって定義された通常のオーバーライド可能なメソッドです。したがって、簡単にオーバーライドして、必要なものを返すようにすることができます。例えば:

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そのようにユーザーに表示したくないでしょう。むしろ、単語間にスペースを入れて適切にフォーマットする必要があります。

于 2012-12-21T00:19:55.913 に答える