Vb.net 向下投射与传递方法

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

当您想要实现一个接口并且仍然继承一个具有共享方法的基类时,是否有一种首选的或最佳的方法来访问基类方法?与其让Select Case检查派生类的类型,还可以只使用下面的传递方法吗

这不是一个真正的项目,我试图通过创建尽可能小的示例来尽可能简化问题,因此这可能不是使用此类功能的最佳方式

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