12-bo‘lim
Vorislik va interfeyslar
Inherits bilan sinfni kengaytirish, Overridable va Overrides, MyBase, MustInherit abstrakt sinflar, Interface va Implements, TypeOf va TryCast.
Ushbu bo‘lim mundarijasi
Vorislik - mavjud sinfning ustiga qurish imkoni. Umumiy qism bir marta yoziladi, farqlar esa vorislarda.
Inherits #
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
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 #
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
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'z | Ma'nosi |
|---|---|
Overridable | Bu metodni voris qayta yozishi mumkin |
Overrides | Ota sinfdagi metodni qayta yozyapman |
MustOverride | Voris qayta yozishi shart |
NotOverridable | Bundan keyin 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 #
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
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.
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
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.
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
hisobot.docx: hisobot.docx diskka yozildi
rasm.png: Rasm siqilib saqlandi
Ko'p tillarda sinf sarlavhasida interfeys nomini yozish kifoya. VB esa har bir a'zoning oxirida ham qaysi interfeys a'zosini bajarayotganini talab qiladi:
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 #
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
Tomoni 4 bo'lgan kvadrat chizildi
16
Sinf bitta sinfdan meros oladi, lekin ko'p interfeysni bajarishi mumkin.
Turni tekshirish #
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
Vov!
It hovlini qo'riqlayapti
Miyov!
True
| Amal | Muvaffaqiyatsiz bo'lsa |
|---|---|
TypeOf x Is Tur | False qaytaradi |
DirectCast(x, Tur) | Xato beradi |
TryCast(x, Tur) | Nothing qaytaradi |
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.
Transportota sinfini vaAvtobus,Poyezdvorislarini yozing.Overridablemetodni vorislarda qayta yozing.MyBasebilan ota versiyani chaqirib, natijaga qo'shimcha qiling.Overridablesiz metodni qayta yozishga urinib, xatoni o'qing.MustInheritsinfdan obyekt yasashga urining.Shaklmisolini uchburchak bilan to'ldiring.ITolanadiganinterfeysini yozib, ikkita sinfda bajaring.- Bitta sinfda ikkita interfeysni bajaring.
TypeOf ... Isbilan ro'yxatdagi turlarni ajrating.DirectCastvaTryCastfarqini noto'g'ri turda sinab ko'ring.
Xulosa #
Inherits- bitta ota sinfdan meros olish;MyBase.Newuning konstruktorini chaqiradi.- Metod qayta yozilishi uchun otada
Overridable, vorisdaOverridesbo'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
Implementshar bir a'zoda takrorlanadi. - Sinf bitta sinfdan meros oladi, lekin ko'p interfeysni bajaradi.
TypeOf ... Istekshiradi,TryCastxavfsiz aylantiradi,DirectCastesa mos kelmasa xato beradi.
Keyingi bo'limda Structure, Enum va Module ni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.