user445714
user445714

Reputation: 393

VB.net abstract class understanding

If I have a class called A and a class called B, if B inherits A that means A is the super class and B is the subclass. I have been asked to describe why class A is not an abstract class but as i see it class A is an abstract class A, as it has been created for Class B to use in the future, is it something to do with Class B not being able to access the fields in Class A as although they are private by default?

Class A looks something like this

Public Class A
    StartDate As Date
    Men As Integer
    Place As String

    Public Sub New()
        StartDate = Today
        Men = 0
        Place = ""
    End Sub
End Class

Class B Looks like this

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

Upvotes: 5

Views: 17361

Answers (2)

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112437

In order to be abstract, class A must have the MustInherit keyword.

Abstract (MustInherit) means that this class serves as base class only and cannot be instantiated with New. It also allows you to declare abstract (MustOverride) members with no implementation, i.e. no method body. The inheriting classes then must override the abstract members and provide an implementation unless they are abstract themselves (where a third level of deriving classes would then provide an implementation).

Note that you are allowed to call an abstract member. At runtime the implementation of the actual implementing class will be called.

See: MustInherit (Visual Basic)

Members are private if not specified otherwise. Specify them to be Protected to allow descendant classes to see them or Public to allow "everybody" to see them.

See: 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

Now, you can use it like this

Sub Test(ByVal a As ClassA)
    a.Print()
End Sub

You can call Test by passing it a ClassB object.

Upvotes: 12

Jesse Seger
Jesse Seger

Reputation: 960

A is not abstract. Abstract means you cannot instantiate the class. It means you MUST inherit it.

Use the abstract keyword to make the class abstract. You can also make methods abstract as well.

If you want B to see certain methods in A, but not to anyone else, use protected keyword.

Sorry, VB uses the MustInherit and MustOverride keywords.

Upvotes: 0

Related Questions