【问题标题】:Downcasting vs. a Passthrough Method向下转换与直通方法
【发布时间】:2016-01-07 10:37:58
【问题描述】:

当您想要实现一个接口并仍然继承具有共享方法的基类时,是否有访问基类方法的首选或最佳实践方式?除了让 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

或:

Select Case obj.GetType()
  Case GetType(Mage)
    CType(obj, Mage).Say("I am a mage!")
  Case GetType(Fighter)
    CType(obj, Fighter).Say("I am a fighter!")
End Select

【问题讨论】:

  • 你会在哪里实现这个逻辑?调用类还是基类内部?

标签: vb.net inheritance interface


【解决方案1】:

您的基类可以包含一个类型,并且每个类的 New 都会设置该值。这将阻止您在您的情况下执行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多