Programowanie zorientowane obiektowo (OOP) to paradygmat programowania oparty na obiektach jako głównej koncepcji. W OOP kod jest formatowany w oparciu o funkcjonalność, umożliwiając utrzymanie kodu, abstrakcję, ponowne użycie, wydajność i liczne funkcje na obiekcie.
Obiekt posiada atrybuty (zmienne), które definiują jego cechy charakterystyczne, właściwości oraz metody (funkcje), które definiują akcje (procedury) i zachowania obiektu.
Programowanie obiektowe w Go różni się od innych języków. Koncepcje zorientowane obiektowo są implementowane w Go przy użyciu struktur, interfejsów i typów niestandardowych.
Dostosowywanie typów w Go
Typy niestandardowe ułatwiają grupowanie i identyfikowanie podobnego kodu do ponownego użycia.
Kod do deklarowania typów niestandardowych to:
rodzaj typeName typ danych
Tworząc własny typ i przypisując zmienną, możesz sprawdzić typ za pomocą odzwierciedlić. Typ() który pobiera zmienną i zwraca typ zmiennej.
import( "fmt"
"odzwierciedlić")
rodzaj dwa int// tworzy typ "dwa"
var numer dwa // zmienna typu „dwa”
fmt. Println (odzwierciedlenie. Rodzaj (liczba))
ten numer zmienna jest typem dwa która jest liczbą całkowitą. Możesz iść dalej, aby stworzyć więcej typu niestandardowego.
Tworzenie struktur w Go
Struktury (struktury) to plany programowania obiektowego w Go. Struktury to zdefiniowane przez użytkownika kolekcje pól.
Struktura może zawierać różne typy danych, w tym typy i metody złożone.
Możesz utworzyć strukturę za pomocą tej składni:
rodzaj Nazwa struktury struktura {
// jakiś kod
}
Konwencjonalnie nazwy struktur są zwykle pisane wielkimi literami i wielbłądami, aby były czytelne.
Typ struktury przyjmuje nazwy pól i typy danych. Struktury mogą przyjmować dowolny typ danych Go, w tym typy niestandardowe.
rodzaj Użytkownik struktura {
pole1 strunowy
pole2 int
poleMapa mapa[strunowy]int
}
Możesz utworzyć wystąpienie typu struktury, przypisując strukturę jako zmienną.
instancja := Użytkownik{
// jakiś kod
}
Instancja struktury może być wypełniona polami podczas tworzenia instancji zgodnie z definicją podczas inicjowania lub ustawiona na wartość null.
instancja := Użytkownik{
pole1: "a strunowy pole",
pole2: 10,
poleMapa: mapa[strunowy]int{},
}
Dostęp do elementów struktury
Dostęp do pól instancji struktury można uzyskać za pomocą notacji kropkowej w polu.
fmt. Println("Dostęp do pola wartości", instance.field2)
To wyprowadza pole2 utworzonej instancji struktury.
Przypisywanie metod do struktur
Funkcje (metody) są przypisywane do typów struktur przez określenie nazwy odbiornika i nazwy struktury przed nazwą funkcji, jak pokazano w poniższej składni.
funkcjonować(nazwa struktury odbiorcy)nazwa funkcji() {
// jakiś kod
}
Metoda nazwa funkcji można używać tylko w określonym typie struktury.
Implementacja dziedziczenia w Go
Dziedziczenie to zdolność obiektów i typów do uzyskiwania dostępu i używania metod i atrybutów innych obiektów. Go nie ma funkcji Dziedziczenie, ale możesz używać kompozycji. W Go kompozycja pociąga za sobą odwoływanie się do nadstruktury (struktury, która ma być dziedziczona) w podstrukturze przez podanie nazwy nadbudowy do podstruktury.
Korzystając z powyższego przykładu struktury:
rodzaj Użytkownik struktura {
pole1 strunowy
pole2 int
poleMapa mapa[strunowy]int
}
rodzaj Użytkownik2 struktura {
Użytkownik
}
Mijając Użytkownik ustrukturyzuj nazwę w Użytkownik2 struktura, Użytkownik2 struct może uzyskać dostęp do wszystkich metod i atrybutów Użytkownik struct na tworzenie instancji, z wyjątkiem technik abstrakcji.
syn := Użytkownik2{
Użytkownik{
pole1: "dziecko",
pole2: 0,
poleMapa: zero,
},
}
fmt. Println (syn.field2)
ten syn zmienna powyżej jest instancją zmiennej Użytkownik2 struktura. Jak widać na przykładzie, syn zmienna może uzyskiwać dostęp do wartości typu Użytkownik i tworzyć ich wystąpienia oraz z nich korzystać.
Hermetyzacja pól typu w Go
Enkapsulacja, znana również jako „ukrywanie informacji”, to technika łączenia metod i atrybutów obiektu w jednostki aby ograniczyć użycie i dostęp z wyjątkiem określonych (włączenie uprawnień do odczytu/zapisu).
Enkapsulacja jest implementowana w Go przy użyciu eksportowanych i nieeksportowanych identyfikatorów w pakietach.
Eksportowane identyfikatory (odczyt i zapis)
Wyeksportowane identyfikatory są eksportowane z ich zdefiniowanych pakietów i dostępu do innych programów. Zapisanie identyfikatora pola wielką literą powoduje wyeksportowanie pola fo.
rodzaj Użytkownik struktura {
Pole1 strunowy
Pole2 int
FieldMap mapa[strunowy]int
}
rodzaj Użytkownik2 struktura {
Użytkownik
}
Nieeksportowane identyfikatory (tylko do odczytu)
Nieeksportowane identyfikatory nie są eksportowane ze zdefiniowanego pakietu i są zwykle pisane małymi literami.
rodzaj Użytkownik struktura {
pole1 strunowy
pole2 int
poleMapa mapa[strunowy]int
}
rodzaj Użytkownik2 struktura {
Użytkownik
}
Pojęcie eksportowanych i nieeksportowanych identyfikatorów dotyczy również metod obiektu.
Polimorfizm w Go
Polimorfizm to technika stosowana do nadawania obiektom różnych form w celu zapewnienia elastyczności.
Go implementuje polimorfizm za pomocą interfejsów. Interfejsy to niestandardowe typy używane do definiowania sygnatur metod.
Deklarowanie interfejsów
Deklarowanie interfejsów jest podobne do deklarowania struktur. Jednak interfejsy są deklarowane przy użyciu berło słowo kluczowe.
rodzaj Nazwa interfejsu berło{
//niektóre metody
}
Deklaracje interfejsu zawierają metody, które mają być implementowane przez typy struktur.
Implementacja interfejsów w strukturach
Typy, które implementują interfejs, muszą być zadeklarowane, po czym metody typu implementują interfejs.
// Interfejs
rodzaj Kolor berło{
Farba() strunowy
}
// Deklaracja struktur
rodzaj Zielony struktura {
// jakiś kod specyficzny dla struktury
}
rodzaj Niebieski struktura {
// jakiś konkretny kod
}
Powyższy fragment kodu ma Kolor interfejs zadeklarowany z a Farba metoda do wdrożenia przez Zielony oraz Niebieski typy struktur.
Interfejsy są implementowane przez przypisanie metod do typów struktur, a następnie nazwanie metody przez metodę interfejsu, która ma zostać zaimplementowana.
funkcjonować(g zielony)Farba()strunowy {
zwrócić „malowane na zielono”
}
funkcjonować(b niebieski)Farba()strunowy {
zwrócić „malowane na niebiesko”
}
Metoda Paint jest implementowana przez typy Green i Blue, które mogą teraz wywoływać i używać Farba metoda.
pędzel := zielony{}
fmt. Println (pędzel. Farba())
„Pomalowany na zielono” jest wydrukowany na konsoli, potwierdzając, że interfejs został pomyślnie zaimplementowany.
Abstrahowanie pól w Go
Abstrakcja jest proces ukrywania nieistotnych metod i atrybutów typu, co ułatwia zabezpieczenie części programu przed nieprawidłowym, niezamierzonym użyciem.
Go nie ma zaimplementowanej abstrakcji od razu; jednak możesz pracować na naszej drodze poprzez implementację abstrakcji za pomocą interfejsów.
// ludzie mogą biegać
rodzaj Człowiek berło {
biegać() strunowy
}
// Chłopiec to człowiek z nogami
rodzaj Chłopiec struktura {
Nogi strunowy
}
// metoda na boy implementuje metodę run interfejsu Human
funkcjonować(h chłopiec)biegać()strunowy {
zwrócić h. Nogi
}
Powyższy kod tworzy Człowiek interfejs z biegać interfejs, który zwraca ciąg. ten Chłopiec typ implementuje biegać metoda Człowiek interfejs i zwraca ciąg znaków podczas tworzenia instancji.
Jednym ze sposobów implementacji abstrakcji jest uczynienie struktury dziedziczącej interfejs, którego metody mają być abstrahowane. Istnieje wiele innych podejść, ale to jest najłatwiejsze.
rodzaj Osoba struktura {
Nazwać strunowy
Wiek int
Status człowieka
}
funkcjonowaćGłówny() {
osoba1 := &Chłopiec{Nogi: "dwie nogi"}
osoba2 := &Osoba{ // instancja osoby
Nazwa: "amina",
Wiek: 19,
Status: osoba1,
}
fmt. Println (osoba Status.run())
}
ten Osoba struct dziedziczy Człowiek interfejs i może uzyskać dostęp do wszystkich swoich metod za pomocą zmiennej Status dziedziczenie interfejsu.
W przypadku wystąpienia przez odwołanie (za pomocą wskaźnika), wystąpienie Osoba struktura Osoba2 odwołuje się do wystąpienia Chłopiec struktura Osoba1 i uzyskuje dostęp do metod.
W ten sposób możesz określić konkretne metody, które mają być zaimplementowane przez typ.
OOP a programowanie funkcjonalne
Programowanie zorientowane obiektowo jest ważnym paradygmatem, ponieważ daje większą kontrolę nad programem i zachęca do ponownego użycia kodu w sposób, w jaki programowanie funkcjonalne nie zapewnia.
Nie oznacza to, że programowanie funkcjonalne jest złym wyborem, ponieważ programowanie funkcjonalne może być pomocne i lepsze w niektórych przypadkach użycia.
Co to jest programowanie obiektowe? Podstawy wyjaśnione w warunkach laika
Czytaj dalej
Powiązane tematy
- Programowanie
- Programowanie obiektowe
O autorze
Goodness jest autorem tekstów technicznych, programistą backendowym i analitykiem danych, upraszczającym różne tematy technologiczne podczas eksploracji tej fascynującej dziedziny.
Zapisz się do naszego newslettera
Dołącz do naszego newslettera, aby otrzymywać porady techniczne, recenzje, bezpłatne e-booki i ekskluzywne oferty!
Kliknij tutaj, aby zasubskrybować