如果我有一个名为 A 的类和一个名为 B 的类,如果 B 继承 A,则意味着 A 是父类(super class),B 是子类。我被要求描述为什么 A 类不是抽象类,但我认为 A 类是抽象类 A,因为它是为 B 类在未来使用而创建的,它是否与 B 类有关?能够访问 A 类中的字段,尽管它们默认是私有(private)的?
A 类看起来像这样
Public Class A
StartDate As Date
Men As Integer
Place As String
Public Sub New()
StartDate = Today
Men = 0
Place = ""
End Sub
End Class
B类是这样的
Public Class B inherits Class A
Grade As ExamGrade
Public Sub New()
MyBase.New
StartDate = Today
Men = 0
Place = ""
Grade = 'Easy'
End Sub
Public Function setGrade(grade As String)
ExamGrade = grade
End Function
End Class
最佳答案
为了成为抽象类,A 类必须有 MustInherit
关键字。
Abstract (MustInherit
) 表示该类仅作为基类,不能用New
实例化。它还允许您声明没有实现的抽象 (MustInherit
) 成员,即没有方法体。然后继承类必须覆盖抽象成员并提供实现,除非它们本身是抽象的(第三级派生类将提供实现)。
请注意,您可以调用抽象成员。在运行时将调用实际实现类的实现。
如果没有另外指定,成员是私有(private)的。将它们指定为 Protected
以允许后代类看到它们,或将它们指定为 Public
以允许“每个人”看到它们。
见:Access Levels in Visual Basic
Public MustInherit ClassA
Protected StartDate As Date
Protected Men As Integer
Protected Place As String
Public Sub New()
StartDate = Today
Men = 0
Place = ""
End Sub
Public MustOverride Sub Print()
End Class
Public ClassB
Inherits ClassA
Public Grade As String
Public Sub New()
MyBase.New() 'This initializes StartDate, Men and Place
Grade = "Easy"
End Sub
Public Sub SetGrade(ByVal grade As String)
Me.Grade = grade
End Sub
Public Overrides Sub Print()
Console.WriteLine($"Grade = {Grade}")
End Sub
End Class
现在,你可以这样使用了
Sub Test(ByVal a As ClassA)
a.Print()
End Sub
您可以通过将 ClassB
对象传递给 Test
来调用它。
关于VB.net抽象类理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8658436/