Vb.net 向下投射与传递方法
当您想要实现一个接口并且仍然继承一个具有共享方法的基类时,是否有一种首选的或最佳的方法来访问基类方法?与其让Select Case检查派生类的类型,还可以只使用下面的传递方法吗 这不是一个真正的项目,我试图通过创建尽可能小的示例来尽可能简化问题,因此这可能不是使用此类功能的最佳方式Vb.net 向下投射与传递方法,vb.net,inheritance,interface,Vb.net,Inheritance,Interface,当您想要实现一个接口并且仍然继承一个具有共享方法的基类时,是否有一种首选的或最佳的方法来访问基类方法?与其让Select Case检查派生类的类型,还可以只使用下面的传递方法吗 这不是一个真正的项目,我试图通过创建尽可能小的示例来尽可能简化问题,因此这可能不是使用此类功能的最佳方式 Public Class Form1 Dim obj As ICharacter Private Sub Button1_Click(sender As Object, e As EventArgs) Handle
Public Class Form1
Dim obj As ICharacter
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
obj = New Fighter
obj.Attack()
obj.Say("I am a fighter!")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
obj = New Mage
obj.Attack()
obj.Say("I am a mage!")
End Sub
End Class
Interface ICharacter
Sub Attack()
Sub Say(ByVal Dialogue As String)
End Interface
Public Class BaseCharacter
Public Shared Sub Say(ByVal Dialogue As String)
Debug.WriteLine(Dialogue)
End Sub
End Class
Public Class Fighter
Inherits BaseCharacter
Implements ICharacter
Public Sub Attack() Implements ICharacter.Attack
Debug.WriteLine("This class swings a sword!")
End Sub
Public Overloads Sub Say(ByVal Dialogue As String) Implements ICharacter.Say
BaseCharacter.Say(Dialogue)
End Sub
End Class
Public Class Mage
Inherits BaseCharacter
Implements ICharacter
Public Sub Attack() Implements ICharacter.Attack
Debug.WriteLine("This class casts a spell!")
End Sub
Public Overloads Sub Say(ByVal Dialogue As String) Implements ICharacter.Say
BaseCharacter.Say(Dialogue)
End Sub
End Class
我正在寻找替代品,例如:
If TypeOf obj Is Mage Then
CType(obj, Mage).Say("I am a mage!")
ElseIf TypeOf obj Is Fighter Then
CType(obj, Fighter).Say("I am a fighter!")
End If
或:
您的基类可以包含一个类型,每个类的新类型将设置该值。这将阻止您在案例中执行GetType
Public Class BaseCharacter
Enum TypeOfCharacter
Mage
Fighter
End Enum
Public Property Type As TypeOfCharacter
Public Shared Sub Say(ByVal Dialogue As String)
Debug.WriteLine(Dialogue)
End Sub
End Class
然后你就可以有一本字符串字典了
Dim speech As New Dictionary(Of BaseCharacter.TypeOfCharacter, String)
speech.Add(BaseCharacter.TypeOfCharacter.Mage, "I am a mage!")
speech.Add(BaseCharacter.TypeOfCharacter.Fighter, "I am a fighter!")
obj.Say(speech(obj.Type))
但在您的示例中,字符串很容易位于实际类中
Public Class Fighter
Inherits BaseCharacter
Implements ICharacter
Public Overloads Sub SayName()
BaseCharacter.Say("I am a fighter!")
End Sub
End Class
Public Class Mage
Inherits BaseCharacter
Implements ICharacter
Public Overloads Sub SayName()
BaseCharacter.Say("I am a mage!")
End Sub
End Class
您将在哪里实现此逻辑?调用类还是在基类内部?
Public Class Fighter
Inherits BaseCharacter
Implements ICharacter
Public Overloads Sub SayName()
BaseCharacter.Say("I am a fighter!")
End Sub
End Class
Public Class Mage
Inherits BaseCharacter
Implements ICharacter
Public Overloads Sub SayName()
BaseCharacter.Say("I am a mage!")
End Sub
End Class