Interfeyslarni amalga oshirish
Dart merosi muhim cheklovga ega: biz bir vaqtning o'zida bir nechta sinflardan sinfni meros qilib olmaymiz, masalan, quyidagicha:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Person{
String name = "";
void display(){
print("Name: $name");
}
}
class Worker{
String company = "";
void work(){
print("Work in $company");
}
}
class Employee extends Person, Worker{ // Ошибка, множественное наследование не допускается
}
|
Ushbu muammoni hal qilish uchun Dart interfeyslarni amalga oshiradi. Ba'zi dasturlash tillarida bo'lgani kabi interfeys alohida ob'ekt emas (masalan, C# yoki Java-dagi interfeys turi), balki bir xil sinf ekanligini tushunish muhimdir. Ya'ni Dartdagi sinf bir vaqtning o'zida interfeys vazifasini bajaradi va boshqa sinf bu interfeysni amalga oshirishi mumkin.
Interfeys bu interfeysni amalga oshiradigan sinflar amal qilishi kerak bo'lgan sintaktik shartnomani ifodalaydi. Ya'ni, agar interfeys klassi biron-bir maydon va usullarni aniqlasa, u holda ushbu interfeysni amalga oshiruvchi sinf ushbu maydon va usullarni ham belgilashi kerak.
Interfeyslarni amalga oshirish uchun instruments operatori ishlatiladi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
void main (){
Person bob = Employee();
bob.name = "Bob";
bob.display(); // Employee name: Bob
}
class Person{
String name;
Person(this.name);
void display(){
print("Name: $name");
}
}
class Employee implements Person{
String name = ""; // реализация поля name
// реализация метода display
void display(){
print("Employee name: $name");
}
}
|
Bunday holda, Employee klassi Person sinfining interfeysidan foydalanadi (Xodim Personni amalga oshiradi). Person sinfining interfeysidan foydalanish Employee klassi Person sinfida belgilangan barcha maydonlar va usullarni amalga oshirishi kerakligini anglatadi. Shuning uchun, Employee klassi nom maydonini va ko'rsatish usulini belgilashi kerak. Aslida, interfeys - bu sinfda ma'lum funksiyalarni o'z ichiga olishi kerak bo'lgan shartnoma (bu holda, nom maydoni va ko'rsatish usuli). Agar Employee klassi Person sinfidagi barcha maydonlar va usullarni aniqlamagan bo'lsa, biz xatoga yo'l qo'yamiz.
Biroq, yuqoridagi misollardan ko'rish mumkinki, konstruktorni amalga oshirish uchun Employee klassi talab qilinmaydi va umuman konstruktorni aniqlamasligi mumkin.
Xuddi shunday, biz bir vaqtning o'zida bir nechta interfeyslarni amalga oshirishimiz mumkin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
void main (){
Employee bob = Employee("Bob", "Google");
bob.display(); // Employee name: Bob
bob.work(); // Employee works in Google
}
class Person{
String name;
Person(this.name);
void display(){
print("Name: $name");
}
}
class Worker{
String company = "";
void work(){
print("Work in $company");
}
}
class Employee implements Person, Worker{
String name; // реализация поля name из Person
String company; // реализация поля company из Worker
// реализация метода display Person
void display(){
print("Employee name: $name");
}
// реализация метода work из Worker
void work(){
print("Employee works in $company");
}
Employee(this.name, this.company);
}
|
Bunday holda, Employee klassi Person va Worker sinflarining interfeysini amalga oshiradi.
Sinf merosi va interfeysni amalga oshirish
Meros olishda olingan sinfdan asosiy sinfdagi bir xil maydonlar va usullarni belgilash talab qilinmaydi (mavhum usullardan tashqari). Agar asosiy sinf konstruktorni aniqlasa, hosila sinf o'zining konstruktorini belgilashi kerak, bu esa asosiy sinf konstruktorini chaqiradi. Olingan sinfda biz super kalit so'z yordamida asosiy sinfni amalga oshirishga murojaat qilishimiz mumkin. Bir nechta meros qo'llab-quvvatlanmaydi.
Interfeysni amalga oshirishda olingan sinf interfeys sinfida belgilangan barcha maydonlar va usullarni belgilashi kerak. Agar asosiy sinfda konstruktor bo'lsa, hosila sinf o'z konstruktorini belgilashi shart EMAS. Olingan sinfda biz super kalit so'z yordamida amalga oshirilgan interfeysning usullariga kira olmaymiz. Bir nechta interfeys ilovalari qo'llab-quvvatlanadi.
isEmpty: Xarita bo'sh bo'lsa, true qiymatini qaytaradi
Xaritadagi har bir element aslida MapEntry ob'ektini ifodalaydi, bu erda K - tugmalar turi va V - qiymatlar turi. Bu tip ikkita xususiyatga ega: kalit (elementning kaliti) va qiymat (element qiymatini saqlaydi). Ushbu xususiyatlardan foydalanib, biz Xaritadagi elementlarning mazmunini olishimiz mumkin. Masalan, Xaritaning barcha elementlari va barcha kalitlari va qiymatlarini alohida-alohida takrorlaymiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
void main (){
var map = { 5 : "Tom"};
map[1] = "Alice";
map[44] = "Bob";
map[6] = "Sam";
// перебор всех элементов
print("All items");
for(var item in map.entries){
// item представляет MapEntry
print("${item.key} - ${item.value}");
}
// перебор ключей
print("Keys");
for(var key in map.keys){
print(key);
}
// перебор значений
print("Values");
for(var value in map.values){
print(value);
}
}
|
Konsol chiqishi:
All items
5 - Tom
1 - Alice
44 - Bob
6 - Sam
Keys
5
1
44
6
Values
Tom
Alice
Bob
Sam
Asosiy xarita usullari:
addAll (Map other): Xaritaga boshqa Map ob'ektini qo'shadi
addEntries (Iterable > newEntries): Xaritaga takrorlanadigan > toʻplamini qoʻshadi
tozalash (): Xaritadan barcha elementlarni olib tashlaydi
containKey (Ob'ekt kaliti): agar Xaritada kalit kaliti bo'lsa, true qiymatini qaytaradi
containValue (Ob'ekt qiymati): Xaritada qiymat mavjud bo'lsa, true qiymatini qaytaradi
olib tashlash (Ob'ekt kaliti): Xaritadan kalit tugmasi bo'lgan elementni olib tashlaydi
Usullarni qo'llash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void main (){
var map = { "Germany" : "Berlin"};
map.addAll({"France" : "Paris", "Spain": "Madrid"}); // добавляем Map
print(map.containsKey("Poland")); // false
print(map.containsKey("France")); // true
print(map.containsValue("Madrid")); // true
// удаляем элемент с ключом "Spain"
map.remove("Spain");
print(map.containsKey("Spain")); // false
print(map.containsValue("Madrid")); // false
}
|
Do'stlaringiz bilan baham: |