VB.net抽象类理解

标签 vb.net abstract-class

如果我有一个名为 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) 成员,即没有方法体。然后继承类必须覆盖抽象成员并提供实现,除非它们本身是抽象的(第三级派生类将提供实现)。

请注意,您可以调用抽象成员。在运行时将调用实际实现类的实现。

见:MustInherit (Visual Basic)

如果没有另外指定,成员是私有(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/

相关文章:

c++ - 无法创建类实例

c++ - 具体类的单独头文件 - C++

java - 我的类没有重写抽象方法compareTo

asp.net - 调用网络服务 "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel"

mysql - VB.NET、MySQL 和 Unicode

c# - VB 到 C# 属性到 int 转换的转换

c++ - 接口(interface)(抽象类)设计的最佳方法?

.net - VB.NET DLL "ActiveX component can' t 创建对象”

c# - 什么是 VB.NET 等同于 C#'s ' using' block

python - 如何在不忘记在子类中添加属性装饰器的情况下覆盖抽象属性方法?