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