在派生类的抽象类中实现接口

时间:2017-10-04 13:06:48

标签: vb.net

假设我有这个界面:

Public Interface IGsm
        Function Run(filePath As String) As Boolean
End Interface

现在我希望所有子类都使用IGsm接口,因此我决定通过抽象类来实现它(希望它是一个很好的方法):

  Public Class MustInherit GsmBase
        Implements IGsm

        Public Function Run(filePath As String) As Boolean Implements IGsm.Run
            Throw New NotImplementedException()
        End Function

    End Class

第一个问题: 如果我将Overridable放到我的函数中,这是否意味着我可以在基类中为所有派生类定义一些实现,并在派生类中实现ovveride rest实现?这是正确的做法吗?

Public Overridable Function Run(filePath As String) As Boolean Implements IGsm.Run
             'Some shared code for all child classes
             '......
End Function

所以派生类可以这样做:

Public Ovverides Function Run(filePath As String) As Boolean Implements IGsm.Run
             MyBase.Run
             'add additional code for this specific child class...
End Function

这一切都正确我写的是什么?

第二个问题:如果我没有在基类中标记Run as Overridable。从基类继承到我的派生类是否意味着我的派生类只需要从基类使用该Run方法的当前实现?

第三个问题:为什么我不能将基类中的Run标记为MustOverides?

2 个答案:

答案 0 :(得分:1)

  1. 无论成员是否可覆盖/覆盖,函数,子和属性以及接口实现都在派生类中继承。

  2. Overridable意味着如果对基本实现感到满意,派生类只能执行任何操作。对函数的调用将自动调用基函数。但如果需要另一个实现,它可以覆盖它。然后,您可以决定是否调用基本实现,具体取决于您是要添加功能还是想要完全替换它。

  3. MustInherit应用于班级。这使您可以将MustOverride应用于成员。 (这比在C#中更复杂,您可以在其中应用相同的关键字abstract两次。)

  4. Public MustInherit Class GsmBase
        Implements IGsm
    
        Public MustOverride Function Run(filePath As String) As Boolean Implements IGsm.Run
    End Class
    

    请注意,您可以结合使用不同的方法。您可以有几个实现接口的抽象基类以及直接实现接口的类

    Interface I
    
    MustInherit Class BaseA Implements I
    MustInherit Class BaseB Implements I
    
    Class A1 Inherits BaseA
    Class A2 Inherits BaseA
    Class A2_1 Inherits A2
    Class B1 Inherits BaseB
    Class B2 Inherits BaseB
    Class C Implements I
    Class D Inherits C
    Class E Inherits D
    

    A1A2A2_1B1B2CD和{E类型的所有对象{1}}与I的分配兼容。

答案 1 :(得分:0)

您没有在示例中创建抽象类,它看起来像这样。

Public Interface IGsm
    Function Run(filePath As String) As Boolean
End Interface

Public MustInherit Class GsmBase
    Implements IGsm

    Public MustOverride Function Run(filePath As String) As Boolean Implements IGsm.Run

End Class

Public Class Gsm
    Inherits GsmBase

    Public Overrides Function Run(filePath As String) As Boolean
        Return False
    End Function

End Class

然后你可以使用is as

    Dim test As IGsm = New Gsm
    test.Run("test") ' This will call Gsm.Run

    Dim test As GsmBase = New Gsm
    test.Run("test") ' This will call Gsm.Run

MustInherit用于类,而不是方法。对于方法,您将使用MustOverride。