Middle+
Երբ և ինչ պայմաններում է սկսվում Swift-ում դիսպետչերիզացիան աշխատել?
sobes.tech AI
Պատասխան AI-ից
Մեթոդների կառավարումը (method dispatch) Swift-ում որոշում է, թե որ կոնկրետ կոդը կիրականացվի օբյեկտի մեթոդի կանչի ժամանակ։ Ընտրությունը կատարվում է Swift կոդի կոմպիլյացիայի ժամանակ։
Ստեղծվել են երեք հիմնական տեսակի կառավարում Swift-ում՝
-
Ուղիղ կառավարում (Direct Dispatch):
- Ամենահետաքրքիրն է։
- Ֆունկցիայի հասցեն հայտնի է կոմպիլյացիայի ժամանակ։
- Օգտագործվում է ըստ նախնական կարգավորման՝
structևenum(քանի որ նրանք չեն աջակցում դասերի ժառանգությանը)։finalդասերի մեթոդներ։privateդասերի մեթոդներ (internalևpublicչեն աջակցում ուղիղ կառավարում)։- Գլոբալ ֆունկցիաներ։
- Ստատիկ մեթոդներ։
- Տարածումներ (extensions)։
-
Աղյուսակի կառավարում (Table Dispatch):
- Օգտագործվում է
class-ների համար, երբ անհրաժեշտ է պոլիմորֆիզմ և ժառանգություն։ - Կատարման ժամանակ (runtime) կոնկրետ մեթոդի հասցեն որոշվում է վիրտուալ մեթոդների աղյուսակով (vtable - Virtual Table)։
- Ամեն մի դաս ունի իր vtable-ը, որը պարունակում է մեթոդների իրականացման ցուցիչներ։
- Աջակցում է ժառանգությանը և մեթոդների վերագրությանը։
class Animal { // Օգտագործում է Table Dispatch func speak() { print("Անհայտ ձայն") } } class Dog: Animal { // Վերագրում, օգտագործում է vtable override func speak() { print("Ուֆ") } } - Օգտագործվում է
-
Աղյուսակի վկաների կառավարում (Witness Table Dispatch):
- Օգտագործվում է պրոտոկոլների (
protocol) համար։ - Դիմում է table dispatch-ին, բայց օգտագործում է վկաների աղյուսակ (witness table)՝ կոնկրետ պրոտոկոլի մեթոդի իրականացման համար։
- Позволяет использовать полиморфизм с протоколами.
protocol Speakable { // Օգտագործում է Witness Table Dispatch func speak() } struct Cat: Speakable { // Պրոտոկոլի իրականացում func speak() { print("Մյաո") } } - Օգտագործվում է պրոտոկոլների (
Ներմուծումներ, որոնք ազդում են ընտրության վրա՝
- Տվյալների տեսակ:
struct,enum,class,protocol։ - Մոդիֆիկատորներ մուտքի համար:
final,private,internal,public։ - Ներառականություն: Մեթոդների վերագրում։
- Պրոտոկոլների համապատասխանություն: Մեթոդների իրականացում պրոտոկոլից։
- Համատեքստի կանչ: Կանչը կոնկրետ տիպով կամ պրոտոկոլով/հիմնային դասով։
Swift կոմպիլյատորը ձգտում է օգտագործել ուղիղ կառավարում, որտեղ դա հնարավոր է, կատարողականի օպտիմալացման համար, բայց անհրաժեշտության դեպքում անցում է կատարում table կամ witness table dispatch։ Մասնակի նշում final կամ private մեթոդների համար թույլ է տալիս պարտադրել ուղիղ կառավարում։