Programowanie w rzutki - ćwiczenia

Dart to język zorientowany obiektowo. Obsługuje funkcje programowania zorientowanego obiektowo, takie jak klasy, interfejsy itp. Aclassw zakresie OOP to plan tworzenia obiektów. ZAclasshermetyzuje dane dla obiektu. Dart zapewnia wbudowaną obsługę tej koncepcji zwanejclass.

Deklarowanie klasy

Użyj class słowo kluczowe, aby zadeklarować plik classw Dart. Definicja klasy zaczyna się od słowa kluczowego class, po którym następuje rozszerzenieclass name; a treść klasy ujęta w nawiasy klamrowe. Składnię tego samego podano poniżej -

Składnia

class class_name {  
   <fields> 
   <getters/setters> 
   <constructors> 
   <functions> 
}

Plik classpo słowie kluczowym następuje nazwa klasy. Podczas nadawania nazw klasom należy wziąć pod uwagę zasady dotyczące identyfikatorów.

Definicja klasy może obejmować:

  • Fields- Pole to dowolna zmienna zadeklarowana w klasie. Pola reprezentują dane dotyczące obiektów.

  • Setters and Getters- Umożliwia programowi inicjowanie i pobieranie wartości pól klasy. Domyślna metoda pobierająca / ustawiająca jest powiązana z każdą klasą. Jednak domyślne mogą zostać przesłonięte przez jawne zdefiniowanie metody ustawiającej / pobierającej.

  • Constructors - odpowiedzialny za alokację pamięci dla obiektów klasy.

  • Functions- Funkcje reprezentują działania, które obiekt może wykonać. Czasami nazywa się je również metodami.

Te komponenty razem nazywane są data members klasy.

Przykład: deklarowanie klasy

class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

Przykład deklaruje klasę Car. Klasa ma pole o nazwieengine. Plikdisp() to prosta funkcja, która wyświetla wartość pola engine.

Tworzenie instancji klasy

Aby utworzyć wystąpienie klasy, użyj newsłowo kluczowe, po którym następuje nazwa klasy. Składnię tego samego podano poniżej -

Składnia

var object_name = new class_name([ arguments ])
  • Plik new Słowo kluczowe jest odpowiedzialne za tworzenie instancji.

  • Prawa strona wyrażenia wywołuje konstruktora. Do konstruktora należy przekazywać wartości, jeśli jest sparametryzowany.

Przykład: tworzenie wystąpienia klasy

var obj = new Car("Engine 1")

Dostęp do atrybutów i funkcji

Dostęp do atrybutów i funkcji klasy można uzyskać za pośrednictwem obiektu. Użyj '.' notacja kropkowa (nazywana jakoperiod), aby uzyskać dostęp do członków danych klasy.

//accessing an attribute 
obj.field_name  

//accessing a function 
obj.function_name()

Przykład

Spójrz na następujący przykład, aby zrozumieć, jak uzyskać dostęp do atrybutów i funkcji w Dart -

void main() { 
   Car c= new Car(); 
   c.disp(); 
}  
class Car {  
   // field 
   String engine = "E1001";  
   
   // function 
   void disp() { 
      print(engine); 
   } 
}

Plik output powyższego kodu wygląda następująco -

E1001

Dart Constructors

Konstruktor to specjalna funkcja klasy, która jest odpowiedzialna za inicjalizację zmiennych klasy. Dart definiuje konstruktora o takiej samej nazwie, jak nazwa klasy. Konstruktor jest funkcją, dlatego można go sparametryzować. Jednak w przeciwieństwie do funkcji konstruktory nie mogą mieć typu zwracanego. Jeśli nie zadeklarujesz konstruktora, wartość domyślnano-argument constructor jest dla Ciebie.

Składnia

Class_name(parameter_list) { 
   //constructor body 
}

Przykład

Poniższy przykład pokazuje, jak używać konstruktorów w Dart -

void main() { 
   Car c = new Car('E1001'); 
} 
class Car { 
   Car(String engine) { 
      print(engine); 
   } 
}

Powinien dać następujący wynik output -

E1001

Nazwani konstruktorzy

Dart zapewnia named constructors aby włączyć definicję klasy multiple constructors. Składnia nazwanych konstruktorów jest taka, jak podano poniżej -

Składnia: definiowanie konstruktora

Class_name.constructor_name(param_list)

Przykład

Poniższy przykład pokazuje, jak można używać nazwanych konstruktorów w Dart -

void main() {           
   Car c1 = new Car.namedConst('E1001');                                       
   Car c2 = new Car(); 
}           
class Car {                   
   Car() {                           
      print("Non-parameterized constructor invoked");
   }                                   
   Car.namedConst(String engine) { 
      print("The engine is : ${engine}");    
   }                               
}

Powinien dać następujący wynik output -

The engine is : E1001 
Non-parameterized constructor invoked

To słowo kluczowe

Plik thissłowo kluczowe odnosi się do bieżącej instancji klasy. Tutaj nazwa parametru i nazwa pola klasy są takie same. Dlatego, aby uniknąć niejednoznaczności, pole klasy jest poprzedzone przedrostkiemthissłowo kluczowe. Poniższy przykład wyjaśnia to samo -

Przykład

Poniższy przykład wyjaśnia, jak używać this słowo kluczowe w Dart -

void main() { 
   Car c1 = new Car('E1001'); 
}  
class Car { 
   String engine; 
   Car(String engine) { 
      this.engine = engine; 
      print("The engine is : ${engine}"); 
   } 
}

Powinien dać następujący wynik output -

The engine is : E1001

Dart Class ─ Getters and Setters

Getters i Setters, zwany także jako accessors i mutators, pozwól programowi odpowiednio zainicjować i pobrać wartości pól klas. Metody pobierające lub metody dostępu są definiowane przy użyciugetsłowo kluczowe. Setery lub mutatory są definiowane za pomocąset słowo kluczowe.

Domyślna metoda pobierająca / ustawiająca jest powiązana z każdą klasą. Jednak domyślne mogą zostać przesłonięte przez jawne zdefiniowanie metody ustawiającej / pobierającej. Funkcja pobierająca nie ma parametrów i zwraca wartość, a metoda ustawiająca ma jeden parametr i nie zwraca wartości.

Składnia: definiowanie metody pobierającej

Return_type  get identifier 
{ 
}

Składnia: definiowanie ustawiacza

set identifier 
{ 
}

Przykład

Poniższy przykład pokazuje, jak możesz używać getters i setters w klasie Dart -

class Student { 
   String name; 
   int age; 
    
   String get stud_name { 
      return name; 
   } 
    
   void set stud_name(String name) { 
      this.name = name; 
   } 
   
   void set stud_age(int age) { 
      if(age<= 0) { 
        print("Age should be greater than 5"); 
      }  else { 
         this.age = age; 
      } 
   } 
   
   int get stud_age { 
      return age;     
   } 
}  
void main() { 
   Student s1 = new Student(); 
   s1.stud_name = 'MARK'; 
   s1.stud_age = 0; 
   print(s1.stud_name); 
   print(s1.stud_age); 
}

Ten kod programu powinien dawać następujące efekty output -

Age should be greater than 5 
MARK 
Null

Dziedziczenie klas

Dart wspiera koncepcję dziedziczenia, która jest zdolnością programu do tworzenia nowych klas z istniejącej klasy. Klasa rozszerzana w celu tworzenia nowszych klas nazywana jest klasą nadrzędną / superklasą. Nowo utworzone klasy nazywane są klasami podrzędnymi / podrzędnymi.

Klasa dziedziczy z innej klasy przy użyciu słowa kluczowego „extends”. Child classes inherit all properties and methods except constructors from the parent class.

Składnia

class child_class_name extends parent_class_name

Note - Dart nie obsługuje wielokrotnego dziedziczenia.

Przykład: dziedziczenie klas

W poniższym przykładzie deklarujemy klasę Shape. Klasa jest rozszerzona oCircleklasa. Ponieważ między klasami istnieje związek dziedziczenia, klasa potomna, czyli klasaCar uzyskuje niejawny dostęp do składowej danych klasy nadrzędnej.

void main() { 
   var obj = new Circle(); 
   obj.cal_area(); 
}  
class Shape { 
   void cal_area() { 
      print("calling calc area defined in the Shape class"); 
   } 
}  
class Circle extends Shape {}

Powinien dać następujący wynik output -

calling calc area defined in the Shape class

Rodzaje dziedziczenia

Dziedziczenie może mieć następujące trzy typy -

  • Single - Każda klasa może być najwyżej z jednej klasy nadrzędnej.

  • Multiple- Klasa może dziedziczyć z wielu klas. Dart nie obsługuje dziedziczenia wielokrotnego.

  • Multi-level - Klasa może dziedziczyć z innej klasy podrzędnej.

Przykład

Poniższy przykład pokazuje, jak działa dziedziczenie wielopoziomowe -

void main() { 
   var obj = new Leaf(); 
   obj.str = "hello"; 
   print(obj.str); 
}  
class Root { 
   String str; 
}  
class Child extends Root {}  
class Leaf extends Child {}  
//indirectly inherits from Root by virtue of inheritance

Klasa Leafwyprowadza atrybuty z klas Root i Child na podstawie dziedziczenia wielopoziomowego. Jegooutput wygląda następująco -

hello

Dart - dziedziczenie klas i przesłanianie metod

Zastępowanie metod to mechanizm, za pomocą którego klasa potomna przedefiniowuje metodę w swojej klasie nadrzędnej. Poniższy przykład ilustruje to samo -

Przykład

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} 
}  
class Child extends Parent { 
   @override 
   void m1(int b) { 
      print("value of b ${b}"); 
   } 
}

Powinien dać następujący wynik output -

value of b 12

Liczba i typ parametrów funkcji muszą być zgodne podczas zastępowania metody. W przypadku niezgodności liczby parametrów lub ich typu danych kompilator Dart zgłasza błąd. Poniższa ilustracja wyjaśnia to samo -

import 'dart:io'; 
void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   void m1(int a){ print("value of a ${a}");} 
} 
class Child extends Parent { 
   @override 
   void m1(String b) { 
      print("value of b ${b}");
   } 
}

Powinien dać następujący wynik output -

value of b 12

Statyczne słowo kluczowe

Plik static słowo kluczowe można zastosować do elementów danych klasy, tj. fields i methods. Zmienna statyczna zachowuje swoje wartości do zakończenia wykonywania programu. Do statycznych elementów członkowskich odwołuje się nazwa klasy.

Przykład

class StaticMem { 
   static int num;  
   static disp() { 
      print("The value of num is ${StaticMem.num}")  ; 
   } 
}  
void main() { 
   StaticMem.num = 12;  
   // initialize the static variable } 
   StaticMem.disp();   
   // invoke the static method 
}

Powinien dać następujący wynik output -

The value of num is 12

Super słowo kluczowe

Plik supersłowo kluczowe jest używane w odniesieniu do bezpośredniego rodzica klasy. Słowa kluczowego można użyć w celu odniesienia się do superklasy wersji plikuvariable, property, lub method. Poniższy przykład ilustruje to samo -

Przykład

void main() { 
   Child c = new Child(); 
   c.m1(12); 
} 
class Parent { 
   String msg = "message variable from the parent class"; 
   void m1(int a){ print("value of a ${a}");} 
} 
class Child extends Parent { 
   @override 
   void m1(int b) { 
      print("value of b ${b}"); 
      super.m1(13); 
      print("${super.msg}")   ; 
   } 
}

Powinien dać następujący wynik output -

value of b 12 
value of a 13 
message variable from the parent class