11-bo‘lim
Sinflar va obyektlar
Class e'lon qilish, Property va uning to'liq shakli, konstruktor Sub New, Me kalit so'zi, Shared a'zolar va ToString ni qayta yozish.
Ushbu bo‘lim mundarijasi
Sinf - o'z ma'lumoti va xatti-harakatiga ega bo'lgan yangi tur. Obyekt esa - shu sinfdan yasalgan aniq nusxa.
Birinchi sinf #
Public Class Talaba
Public Property Ism As String
Public Property Yosh As Integer
Public Property Ball As Integer
End Class
Module Dastur
Sub Main()
Dim t As New Talaba()
t.Ism = "Malika"
t.Yosh = 22
t.Ball = 88
Console.WriteLine($"{t.Ism}, {t.Yosh} yosh, {t.Ball} ball")
End Sub
End Module
Malika, 22 yosh, 88 ball
Public Property Ism As String - bu avtomatik xossa. VB o'zi
yashirin maydon yaratadi va o'qish-yozishni ta'minlaydi.
Konstruktor #
Har safar uchta qatorni yozish zerikarli. Sub New buni hal qiladi:
Public Class Talaba
Public Property Ism As String
Public Property Yosh As Integer
Public Sub New(ism As String, yosh As Integer)
Me.Ism = ism
Me.Yosh = yosh
End Sub
End Class
Module Dastur
Sub Main()
Dim a As New Talaba("Nodira", 21)
Dim b As New Talaba("Husanboy", 25)
Console.WriteLine($"{a.Ism} - {a.Yosh}")
Console.WriteLine($"{b.Ism} - {b.Yosh}")
End Sub
End Module
Nodira - 21
Husanboy - 25
Me - "shu obyektning o'zi" degani. Me.Ism = ism da chapdagi -
xossa, o'ngdagi - parametr. Ularning nomi bir xil bo'lgani uchun
Me ni yozish shart.
Bir necha konstruktor #
Public Class Kitob
Public Property Nom As String
Public Property Muallif As String
Public Property Yil As Integer
Public Sub New(nom As String)
Me.New(nom, "noma'lum", 0)
End Sub
Public Sub New(nom As String, muallif As String, yil As Integer)
Me.Nom = nom
Me.Muallif = muallif
Me.Yil = yil
End Sub
End Class
Module Dastur
Sub Main()
Dim k1 As New Kitob("O'tkan kunlar", "Abdulla Qodiriy", 1926)
Dim k2 As New Kitob("Daftar")
Console.WriteLine($"{k1.Nom} / {k1.Muallif} / {k1.Yil}")
Console.WriteLine($"{k2.Nom} / {k2.Muallif} / {k2.Yil}")
End Sub
End Module
O'tkan kunlar / Abdulla Qodiriy / 1926
Daftar / noma'lum / 0
Me.New(...) - bitta konstruktordan boshqasini chaqirish usuli. Kod
takrorlanmaydi.
Metodlar #
Public Class Hisob
Public Property Egasi As String
Private _qoldiq As Decimal
Public Sub New(egasi As String, boshlangich As Decimal)
Me.Egasi = egasi
_qoldiq = boshlangich
End Sub
Public Sub Qoshish(summa As Decimal)
If summa <= 0 Then
Console.WriteLine("Summa musbat bo'lishi kerak")
Exit Sub
End If
_qoldiq += summa
End Sub
Public Function Yechish(summa As Decimal) As Boolean
If summa > _qoldiq Then
Return False
End If
_qoldiq -= summa
Return True
End Function
Public Function Qoldiq() As Decimal
Return _qoldiq
End Function
End Class
Module Dastur
Sub Main()
Dim h As New Hisob("Husanboy", 500000D)
h.Qoshish(250000D)
Console.WriteLine(h.Qoldiq())
Console.WriteLine(h.Yechish(100000D))
Console.WriteLine(h.Yechish(9000000D))
Console.WriteLine(h.Qoldiq())
h.Qoshish(-5)
End Sub
End Module
750000
True
False
650000
Summa musbat bo'lishi kerak
_qoldiq maydoni Private - unga tashqaridan tegib bo'lmaydi. Pulni
faqat Qoshish va Yechish orqali o'zgartirish mumkin va ular
qoidalarni tekshiradi.
Bu inkapsulyatsiya deb ataladi va obyektga yo'naltirilgan dasturlashning asosiy g'oyasi.
Agar _qoldiq Public bo'lganda, har kim h._qoldiq = -999999 deb
yozib, hisobni buzib qo'yishi mumkin edi. Yashirilgan maydon esa
faqat siz yozgan qoidalar orqali o'zgaradi.
VB da yashirin maydon nomini _ bilan boshlash odat tusiga kirgan.
Xossaning to'liq shakli #
Qiymatni tekshirish kerak bo'lsa, avtomatik xossa o'rniga to'liq shakli yoziladi:
Public Class Mahsulot
Private _narx As Decimal
Public Property Narx As Decimal
Get
Return _narx
End Get
Set(qiymat As Decimal)
If qiymat < 0 Then
_narx = 0
Else
_narx = qiymat
End If
End Set
End Property
End Class
Module Dastur
Sub Main()
Dim m As New Mahsulot()
m.Narx = 15000D
Console.WriteLine(m.Narx)
m.Narx = -500D
Console.WriteLine(m.Narx)
End Sub
End Module
15000
0
Manfiy narx berilganda xossa uni 0 ga aylantirdi. Tashqaridan
qaraganda bu oddiy o'zgaruvchidek ko'rinadi, aslida esa ichida
tekshiruv bor.
Faqat o'qiladigan xossa #
Public Class Odam
Public Property Ism As String
Public Property Familiya As String
Public ReadOnly Property ToliqIsm As String
Get
Return $"{Familiya} {Ism}"
End Get
End Property
End Class
Module Dastur
Sub Main()
Dim o As New Odam With {.Ism = "Dilnoza", .Familiya = "Yusupova"}
Console.WriteLine(o.ToliqIsm)
End Sub
End Module
Yusupova Dilnoza
ReadOnly Property - har chaqirilganda hisoblanadi, saqlanmaydi.
With {.Ism = ..., ...} - obyekt yaratishda bir nechta xossani
birdaniga to'ldirish shakli.
Shared a'zolar #
Public Class Hisoblagich
Public Shared Soni As Integer = 0
Public Property Nom As String
Public Sub New(nom As String)
Me.Nom = nom
Soni += 1
End Sub
Public Shared Function Tavsif() As String
Return $"Jami yaratilgan: {Soni}"
End Function
End Class
Module Dastur
Sub Main()
Dim a As New Hisoblagich("birinchi")
Dim b As New Hisoblagich("ikkinchi")
Dim c As New Hisoblagich("uchinchi")
Console.WriteLine(Hisoblagich.Soni)
Console.WriteLine(Hisoblagich.Tavsif())
Console.WriteLine(c.Nom)
End Sub
End Module
3
Jami yaratilgan: 3
uchinchi
Shared a'zo obyektga emas, sinfning o'ziga tegishli. Shuning
uchun u Hisoblagich.Soni deb chaqiriladi, a.Soni deb emas.
ToString ni qayta yozish #
Public Class Nuqta
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function ToString() As String
Return $"({X}, {Y})"
End Function
End Class
Module Dastur
Sub Main()
Dim n As New Nuqta(3, 7)
Console.WriteLine(n)
Console.WriteLine($"Nuqta: {n}")
Dim royxat As New List(Of Nuqta) From {
New Nuqta(1, 1), New Nuqta(2, 4)
}
Console.WriteLine(String.Join(" ", royxat))
End Sub
End Module
(3, 7)
Nuqta: (3, 7)
(1, 1) (2, 4)
ToString ni qayta yozmasangiz, Console.WriteLine(n) sinf nomini
chiqaradi - bu foydasiz. Har bir ma'lumot saqlaydigan sinf uchun uni
yozish yaxshi odat.
Obyekt - havola turi #
Public Class Quti
Public Property Ichi As String
End Class
Module Dastur
Sub Main()
Dim a As New Quti With {.Ichi = "olma"}
Dim b As Quti = a
b.Ichi = "anor"
Console.WriteLine(a.Ichi)
Console.WriteLine(b.Ichi)
Console.WriteLine(a Is b)
End Sub
End Module
anor
anor
True
Dim b = a yangi obyekt yaratmaydi - ikkala nom ham bitta
obyektga ishora qiladi. Massivlardagi vaziyatning aynan o'zi.
Haqiqiy nusxa kerak bo'lsa, uni o'zingiz yasashingiz kerak: yangi obyekt yaratib, xossalarni ko'chirish.
a Is b - ikkalasi ayni bir obyektmi degan savolga javob beradi.
Kitobsinfini yarating: nom, muallif, yil xossalari bilan.- Unga konstruktor qo'shing.
- Ikkita konstruktor yozib, birini
Me.Newbilan chaqiring. TalabasinfigaBallxossasini 0-100 oralig'ida cheklang.ReadOnly Propertybilan to'liq ismni qaytaring.With {...}shakli bilan obyekt yarating.- Yaratilgan obyektlar sonini
Sharedmaydon bilan sanang. ToStringni qayta yozib,Console.WriteLine(obyekt)ni sinang.- Ikkita o'zgaruvchi bitta obyektga ishora qilishini isbotlang.
- Obyektning haqiqiy nusxasini yasaydigan metod yozing.
Xulosa #
- Sinf
Public Class ... End Classbilan e'lon qilinadi. Public Property Ism As String- avtomatik xossa, eng qisqa yo'l.- Konstruktor -
Sub New;Me.New(...)bilan boshqasini chaqirish mumkin. Me- joriy obyekt; parametr va xossa nomi bir xil bo'lganda shart.- Maydonni
Privateqiling, kirishni xossa orqali bering - inkapsulyatsiya. - Xossaning to'liq shakli
Get/Setbilan tekshiruv qo'shish imkonini beradi. Shareda'zo sinfga tegishli, obyektga emas.ToStringni qayta yozing -WriteLinevaJoinshuni ishlatadi.- Obyekt - havola turi:
b = anusxa yaratmaydi.
Keyingi bo'limda vorislik va interfeyslarni 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.