VB.net抽象类理解

问题描述 投票:0回答:2

如果我有一个名为A的类和一个名为B的类,如果B继承A,则意味着A是超类,B是子类。我被要求描述为什么类 A 不是抽象类,但据我所知,类 A 是一个抽象类 A,因为它是为类 B 将来使用而创建的,这是否与类 B 有关?能够访问 A 类中的字段,尽管它们默认是私有的?

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
vb.net abstract-class
2个回答
12
投票

为了成为抽象类,A 类必须具有

MustInherit
关键字。

Abstract (

MustInherit
) 表示该类仅作为基类,不能用
New
实例化。它还允许您声明没有实现的抽象 (
MustOverride
) 成员,即没有方法体。然后,继承类必须重写抽象成员并提供实现,除非它们本身是抽象的(其中第三层派生类将提供实现)。

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

请参阅:必须继承 (Visual Basic)

如果没有另外指定,成员是私有的。将它们指定为

Protected
以允许后代类看到它们,或
Public
以允许“每个人”看到它们。

请参阅: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

您可以通过传递一个

Test
对象来调用
ClassB


0
投票

A不是抽象的。抽象意味着您无法实例化该类。这意味着你必须继承它。

使用abstract关键字使类抽象。您也可以使方法抽象。

如果您希望 B 看到 A 中的某些方法,但不让其他人看到,请使用 protected 关键字。

抱歉,VB 使用 MustInherit 和 MustOverride 关键字。

© www.soinside.com 2019 - 2024. All rights reserved.