12-bo‘lim

Vorislik va interfeyslar

Inherits bilan sinfni kengaytirish, Overridable va Overrides, MyBase, MustInherit abstrakt sinflar, Interface va Implements, TypeOf va TryCast.

🕑 10 daqiqa o‘qish 📄 514 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Inherits
  2. Metodni qayta yozish
  3. MyBase bilan ota versiyani chaqirish
  4. Abstrakt sinf
  5. Interfeys
  6. Bir necha interfeys
  7. Turni tekshirish
  8. Xulosa

Vorislik - mavjud sinfning ustiga qurish imkoni. Umumiy qism bir marta yoziladi, farqlar esa vorislarda.

Inherits #

VB
Public Class Hayvon
    Public Property Nom As String

    Public Sub New(nom As String)
        Me.Nom = nom
    End Sub

    Public Sub Yurish()
        Console.WriteLine($"{Nom} yuryapti")
    End Sub
End Class

Public Class It
    Inherits Hayvon

    Public Sub New(nom As String)
        MyBase.New(nom)
    End Sub

    Public Sub Hurish()
        Console.WriteLine($"{Nom}: Vov-vov!")
    End Sub
End Class

Module Dastur
    Sub Main()
        Dim it As New It("Boryi")
        it.Yurish()
        it.Hurish()
    End Sub
End Module
Natija
Boryi yuryapti
Boryi: Vov-vov!

It sinfida Yurish yozilmagan - u Hayvon dan meros olingan. MyBase.New(nom) esa ota sinfning konstruktorini chaqiradi.

Metodni qayta yozish #

VB
Public Class Hayvon
    Public Property Nom As String

    Public Sub New(nom As String)
        Me.Nom = nom
    End Sub

    Public Overridable Sub Ovoz()
        Console.WriteLine($"{Nom} qandaydir ovoz chiqardi")
    End Sub
End Class

Public Class It
    Inherits Hayvon

    Public Sub New(nom As String)
        MyBase.New(nom)
    End Sub

    Public Overrides Sub Ovoz()
        Console.WriteLine($"{Nom}: Vov-vov!")
    End Sub
End Class

Public Class Mushuk
    Inherits Hayvon

    Public Sub New(nom As String)
        MyBase.New(nom)
    End Sub

    Public Overrides Sub Ovoz()
        Console.WriteLine($"{Nom}: Miyov!")
    End Sub
End Class

Module Dastur
    Sub Main()
        Dim hayvonlar As New List(Of Hayvon) From {
            New It("Boryi"), New Mushuk("Mosh"), New Hayvon("Noma'lum")
        }

        For Each h As Hayvon In hayvonlar
            h.Ovoz()
        Next
    End Sub
End Module
Natija
Boryi: Vov-vov!
Mosh: Miyov!
Noma'lum qandaydir ovoz chiqardi

Bu - polimorfizm. Ro'yxat Hayvon turida, lekin har bir obyekt o'zining haqiqiy versiyasini bajardi.

Kalit so'zMa'nosi
OverridableBu metodni voris qayta yozishi mumkin
OverridesOta sinfdagi metodni qayta yozyapman
MustOverrideVoris qayta yozishi shart
NotOverridableBundan keyin qayta yozib bo'lmaydi
Overridable yozilmagan metodni qayta yozib bo'lmaydi

Boshqa ba'zi tillardan farqli, VB da metod standart holatda qayta yozilmaydi.

Ota sinfda Overridable yozilmagan bo'lsa, vorisda Overrides yozganingizda kompilyator xato beradi.

Bu ataylab qilingan: sinf muallifi qaysi metod kengaytirish uchun mo'ljallanganini aniq ko'rsatishi kerak.

MyBase bilan ota versiyani chaqirish #

VB
Public Class Xodim
    Public Property Ism As String
    Public Property Maosh As Decimal

    Public Sub New(ism As String, maosh As Decimal)
        Me.Ism = ism
        Me.Maosh = maosh
    End Sub

    Public Overridable Function Tavsif() As String
        Return $"{Ism}, maosh: {Maosh}"
    End Function
End Class

Public Class Boshliq
    Inherits Xodim

    Public Property Bolim As String

    Public Sub New(ism As String, maosh As Decimal, bolim As String)
        MyBase.New(ism, maosh)
        Me.Bolim = bolim
    End Sub

    Public Overrides Function Tavsif() As String
        Return MyBase.Tavsif() & $", {Bolim} bo'limi boshlig'i"
    End Function
End Class

Module Dastur
    Sub Main()
        Dim b As New Boshliq("Karimov", 12000000D, "Savdo")
        Console.WriteLine(b.Tavsif())
    End Sub
End Module
Natija
Karimov, maosh: 12000000, Savdo bo'limi boshlig'i

MyBase.Tavsif() - ota sinf versiyasini ishlatib, ustiga qo'shimcha qilish. Kod takrorlanmaydi.

Abstrakt sinf #

Ba'zan ota sinfdan obyekt yasashning ma'nosi yo'q: "shakl" degan narsa mavjud emas, faqat aylana yoki to'rtburchak bor.

VB
Public MustInherit Class Shakl
    Public Property Nom As String

    Public Sub New(nom As String)
        Me.Nom = nom
    End Sub

    Public MustOverride Function Yuza() As Double

    Public Sub Korsat()
        Console.WriteLine($"{Nom} yuzasi: {Math.Round(Yuza(), 2)}")
    End Sub
End Class

Public Class Aylana
    Inherits Shakl

    Private _radius As Double

    Public Sub New(radius As Double)
        MyBase.New("Aylana")
        _radius = radius
    End Sub

    Public Overrides Function Yuza() As Double
        Return Math.PI * _radius * _radius
    End Function
End Class

Public Class Torburchak
    Inherits Shakl

    Private _a As Double
    Private _b As Double

    Public Sub New(a As Double, b As Double)
        MyBase.New("To'rtburchak")
        _a = a
        _b = b
    End Sub

    Public Overrides Function Yuza() As Double
        Return _a * _b
    End Function
End Class

Module Dastur
    Sub Main()
        Dim shakllar As New List(Of Shakl) From {
            New Aylana(3), New Torburchak(4, 5)
        }

        For Each s As Shakl In shakllar
            s.Korsat()
        Next
    End Sub
End Module
Natija
Aylana yuzasi: 28.27
To'rtburchak yuzasi: 20
  • MustInherit - bu sinfdan to'g'ridan-to'g'ri obyekt yasab bo'lmaydi.
  • MustOverride - vorislar bu metodni yozishi shart, tanasi yo'q.

Interfeys #

Interfeys - "nima qila olishi kerak"ning ro'yxati. Unda kod bo'lmaydi.

VB
Public Interface ISaqlanadigan
    Function Saqlash() As String
    ReadOnly Property Nomi As String
End Interface

Public Class Hujjat
    Implements ISaqlanadigan

    Private _nom As String

    Public Sub New(nom As String)
        _nom = nom
    End Sub

    Public ReadOnly Property Nomi As String Implements ISaqlanadigan.Nomi
        Get
            Return _nom
        End Get
    End Property

    Public Function Saqlash() As String Implements ISaqlanadigan.Saqlash
        Return $"{_nom} diskka yozildi"
    End Function
End Class

Public Class Rasm
    Implements ISaqlanadigan

    Public ReadOnly Property Nomi As String Implements ISaqlanadigan.Nomi
        Get
            Return "rasm.png"
        End Get
    End Property

    Public Function Saqlash() As String Implements ISaqlanadigan.Saqlash
        Return "Rasm siqilib saqlandi"
    End Function
End Class

Module Dastur
    Sub Main()
        Dim narsalar As New List(Of ISaqlanadigan) From {
            New Hujjat("hisobot.docx"), New Rasm()
        }

        For Each n As ISaqlanadigan In narsalar
            Console.WriteLine($"{n.Nomi}: {n.Saqlash()}")
        Next
    End Sub
End Module
Natija
hisobot.docx: hisobot.docx diskka yozildi
rasm.png: Rasm siqilib saqlandi
VB da Implements har bir a'zoda yoziladi

Ko'p tillarda sinf sarlavhasida interfeys nomini yozish kifoya. VB esa har bir a'zoning oxirida ham qaysi interfeys a'zosini bajarayotganini talab qiladi:

VB
Public Function Saqlash() As String Implements ISaqlanadigan.Saqlash

Bu ko'proq yozuv, lekin bitta foydasi bor: metod nomini boshqacha qo'yish mumkin. Masalan Public Function Yozish() As String Implements ISaqlanadigan.Saqlash ham to'g'ri ishlaydi.

Bir necha interfeys #

VB
Public Interface IChizilodigan
    Sub Chizish()
End Interface

Public Interface IOlchanadigan
    Function Yuza() As Double
End Interface

Public Class Kvadrat
    Implements IChizilodigan, IOlchanadigan

    Private _tomon As Double

    Public Sub New(tomon As Double)
        _tomon = tomon
    End Sub

    Public Sub Chizish() Implements IChizilodigan.Chizish
        Console.WriteLine($"Tomoni {_tomon} bo'lgan kvadrat chizildi")
    End Sub

    Public Function Yuza() As Double Implements IOlchanadigan.Yuza
        Return _tomon * _tomon
    End Function
End Class

Module Dastur
    Sub Main()
        Dim k As New Kvadrat(4)
        k.Chizish()
        Console.WriteLine(k.Yuza())
    End Sub
End Module
Natija
Tomoni 4 bo'lgan kvadrat chizildi
16

Sinf bitta sinfdan meros oladi, lekin ko'p interfeysni bajarishi mumkin.

Turni tekshirish #

VB
Public MustInherit Class Hayvon
    Public MustOverride Sub Ovoz()
End Class

Public Class It
    Inherits Hayvon
    Public Overrides Sub Ovoz()
        Console.WriteLine("Vov!")
    End Sub
    Public Sub Qorovullik()
        Console.WriteLine("It hovlini qo'riqlayapti")
    End Sub
End Class

Public Class Mushuk
    Inherits Hayvon
    Public Overrides Sub Ovoz()
        Console.WriteLine("Miyov!")
    End Sub
End Class

Module Dastur
    Sub Main()
        Dim hayvonlar As New List(Of Hayvon) From {New It(), New Mushuk()}

        For Each h As Hayvon In hayvonlar
            h.Ovoz()

            If TypeOf h Is It Then
                Dim it As It = DirectCast(h, It)
                it.Qorovullik()
            End If
        Next

        Dim birinchi As Hayvon = hayvonlar(0)
        Dim sinov As Mushuk = TryCast(birinchi, Mushuk)
        Console.WriteLine(sinov Is Nothing)
    End Sub
End Module
Natija
Vov!
It hovlini qo'riqlayapti
Miyov!
True
AmalMuvaffaqiyatsiz bo'lsa
TypeOf x Is TurFalse qaytaradi
DirectCast(x, Tur)Xato beradi
TryCast(x, Tur)Nothing qaytaradi
TryCast xavfsizroq

DirectCast tur mos kelmasa dasturni to'xtatadi. TryCast esa Nothing qaytaradi - shuning uchun natijani tekshirib ko'rish mumkin.

TryCast faqat havola turlari bilan ishlaydi; Integer kabi qiymat turlari uchun TypeOf ... Is va CType ishlatiladi.

Amaliy topshiriq
  1. Transport ota sinfini va Avtobus, Poyezd vorislarini yozing.
  2. Overridable metodni vorislarda qayta yozing.
  3. MyBase bilan ota versiyani chaqirib, natijaga qo'shimcha qiling.
  4. Overridable siz metodni qayta yozishga urinib, xatoni o'qing.
  5. MustInherit sinfdan obyekt yasashga urining.
  6. Shakl misolini uchburchak bilan to'ldiring.
  7. ITolanadigan interfeysini yozib, ikkita sinfda bajaring.
  8. Bitta sinfda ikkita interfeysni bajaring.
  9. TypeOf ... Is bilan ro'yxatdagi turlarni ajrating.
  10. DirectCast va TryCast farqini noto'g'ri turda sinab ko'ring.

Xulosa #

  • Inherits - bitta ota sinfdan meros olish; MyBase.New uning konstruktorini chaqiradi.
  • Metod qayta yozilishi uchun otada Overridable, vorisda Overrides bo'lishi shart.
  • MyBase.Metod() ota versiyani ishlatib, ustiga qo'shish imkonini beradi.
  • MustInherit - obyekt yasab bo'lmaydigan sinf, MustOverride - vorisda yozilishi shart bo'lgan metod.
  • Interfeys - kodsiz shartnoma; VB da Implements har bir a'zoda takrorlanadi.
  • Sinf bitta sinfdan meros oladi, lekin ko'p interfeysni bajaradi.
  • TypeOf ... Is tekshiradi, TryCast xavfsiz aylantiradi, DirectCast esa mos kelmasa xato beradi.

Keyingi bo'limda Structure, Enum va Module ni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.