假设我有这个界面:
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?
答案 0 :(得分:1)
无论成员是否可覆盖/覆盖,函数,子和属性以及接口实现都在派生类中继承。
Overridable意味着如果对基本实现感到满意,派生类只能执行任何操作。对函数的调用将自动调用基函数。但如果需要另一个实现,它可以覆盖它。然后,您可以决定是否调用基本实现,具体取决于您是要添加功能还是想要完全替换它。
将MustInherit
应用于班级。这使您可以将MustOverride
应用于成员。 (这比在C#中更复杂,您可以在其中应用相同的关键字abstract
两次。)
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
A1
,A2
,A2_1
,B1
,B2
,C
,D
和{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。