次のコード
player2.getWeapon.ToString()
戻り値
'RockPaperScissors.Rock'
また
'RockPaperScissors.Paper'
また
'RockPaperScissors.Scissors'
クラス名、つまりロック、ペーパー、はさみに興味があります。どうすればこれを達成できますか?
スプリットが私の頭に浮かんだものでしたが、それが最高かどうかはわかりませんでした。
はい、string.Split
適切な方法のようです:
Dim tokens As String() = player2.getWeapon.ToString().Split("."c)
Dim className As String = tokens.Last() ' or simply tokens(1) without Linq
Weapon
しかし、それを直接返すプロパティを使用してクラスを拡張できる場合は、それを実行します。
本当に 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
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
そのようにユーザーに表示したくないでしょう。むしろ、単語間にスペースを入れて適切にフォーマットする必要があります。