oops concepts c object oriented programming concept tutorial
W tym samouczku wyjaśniono koncepcje OOPS w języku C #. Możesz dowiedzieć się o zasadach programowania zorientowanego obiektowo, takich jak polimorfizm, enkapsulacja, dziedziczenie i abstrakcja:
Programowanie zorientowane obiektowo to model programowania, który działa na zasadzie, która obraca się wokół obiektów, a nie akcji lub logiki. Pozwala użytkownikom tworzyć obiekty w oparciu o wymagania, a następnie tworzyć metody do działania na tych obiektach.
Praca na tych obiektach w celu uzyskania pożądanego wyniku jest celem programowania obiektowego.
=> Zapoznaj się z całą serią samouczków szkoleniowych języka C # tutaj
Powtórzmy niektóre koncepcje, których nauczyliśmy się we wcześniejszych samouczkach !!
Przestrzeń nazw
Przestrzeń nazw w języku C # to zbiór klas. Zapewnia strukturę oddzielającą jedną nazwę klasy od nazwy innej klasy, deklarując ją w innej przestrzeni nazw. Aby klasy o tej samej nazwie nie kolidowały ze sobą.
Klasa
Klasa to plan typu danych. W rzeczywistości jest to zbiór przedmiotów. Zawiera obiekty i definicję operacji, która ma zostać wykonana na tym obiekcie.
Obiekty
Obiekty są instancjami klasy.
W naszych poprzednich samouczkach szczegółowo poznaliśmy już klasy i obiekty.
Czego się nauczysz:
Pojęcia OOPS w C #
Programowanie zorientowane obiektowo oferuje kilka zalet w porównaniu z innymi modelami programowania, takimi jak:
- Precyzyjne i przejrzyste modułowe podejście do programów zapewnia łatwe zrozumienie i konserwację.
- Klasy i obiekty utworzone w projekcie mogą być używane w całym projekcie.
- Podejście modułowe umożliwia niezależne istnienie różnych modułów, umożliwiając tym samym kilku różnym programistom wspólną pracę nad różnymi modułami.
W tym samouczku skupimy się bardziej na innych głównych podstawowych koncepcjach OOPS:
- Kapsułkowanie
- Wielopostaciowość
- Dziedzictwo
- Abstrakcja
Kapsułkowanie
Hermetyzacja to koncepcja programowania zorientowanego obiektowo, która umożliwia programistom zawijanie danych i fragmentów kodu wewnątrz obudowy. Używając programu do hermetyzacji, możesz ukryć członków jednej klasy przed inną klasą. To tak, jakby otaczać logiczną pozycję w pakiecie. Pozwala tylko na istotne informacje dostępne i widoczne na zewnątrz, a także tylko dla określonych członków.
Hermetyzacja jest implementowana przy użyciu specyfikatorów dostępu. Specyfikator dostępu służy do definiowania widoczności i dostępności elementu członkowskiego klasy w C #.
C # zawiera następujące specyfikatory dostępu.
jaki jest najlepszy darmowy konwerter wideo
- Publiczny
- Prywatny
- Chroniony
- Wewnętrzny
Specyfikatory dostępu definiują widoczność klasy i jej wartości. Pozwala na uwidocznienie danych dla określonej części kodu i ukrycie ich przed inną częścią. Najczęściej używaną widocznością jest widoczność publiczna i prywatna.
Przyjrzyjmy się im.
Publiczny: Słowo kluczowe public pozwala, aby jego członkowie byli widoczni z dowolnego miejsca wewnątrz projektu. Ten specyfikator dostępu ma najmniejsze ograniczenie widoczności.
Prywatny: Dostęp do członków prywatnych ma tylko członek tej samej klasy. Ma to jedną z najbardziej ograniczonych widoczności.
Chroniony: Dostęp chroniony umożliwia dostęp do elementu członkowskiego z poziomu klasy iz innej klasy, która dziedziczy tę klasę.
Wewnętrzny: Wewnętrzny zapewnia dostępność z poziomu projektu. Inna podobna dostępność wewnętrzna jest chroniona wewnętrznie. Pozwala to na to samo, co wewnętrzna, a jedyną różnicą jest to, że klasa potomna może dziedziczyć tę klasę i docierać do jej członków nawet z innego projektu.
Wielopostaciowość
Polimorfizm wywodzi się ze słownika greckiego i oznacza taki, który ma wiele form. Poly oznacza wiele, a Morph oznacza formy. Pozwala klasie w C # mieć wiele implementacji o tej samej nazwie.
Polimorfizm dzieli się zasadniczo na dwie części:
- Polimorfizm w czasie kompilacji
- Polimorfizm w czasie wykonywania
# 1) Polimorfizm statyczny lub czas kompilacji
Polimorfizm w czasie kompilacji jest również znany jako polimorfizm statyczny. Przeciążanie metod jest jednym ze sposobów osiągania polimorfizmu w czasie kompilacji. Jest znany jako polimorfizm czasu kompilacji, ponieważ decyzja o wywołaniu metody jest podejmowana w czasie kompilacji.
Osiąga się to poprzez zachowanie tej samej nazwy metody, ale przekazanie różnych zestawów parametrów. W przypadku przeciążania metod system najpierw sprawdza zastosowany parametr i na podstawie zestawu parametrów decyduje się wywołać odpowiednią metodę.
Przykład:
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i+j) ); } void print(string a, string b) { Console.WriteLine('Printing String: ' , (a+b)); } static void Main(string[] args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello','World'); Console.ReadKey(); } }
W powyższym przykładzie dwukrotnie nazwaliśmy tę samą metodę „print”, używając różnych parametrów. Najpierw jako parametry przekazujemy dwie liczby całkowite, a następnie jako parametry przekazaliśmy dwa ciągi. Istnieją dwie metody „drukowania” o tej samej nazwie.
Kiedy przekażemy parametr z systemem liczb całkowitych, będzie szukał metody o nazwie „print”, która akceptuje dwa parametry całkowite i wykona ją, ignorując inne metody o tej samej nazwie.
W drugiej części przekazaliśmy parametr string. System ponownie będzie szukał metody, która akceptuje dwa parametry łańcuchowe. W związku z tym, w oparciu o przekazane parametry, pierwsza metoda doda dwie liczby całkowite, a następna połączy dwa ciągi.
# 2) Dynamiczny polimorfizm lub polimorfizm w czasie wykonywania
Polimorfizm czasu wykonywania lub polimorfizm dynamiczny występuje, gdy zarówno nazwa metody, jak i sygnatura metody mają tę samą nazwę i parametry. Nadpisywanie metody jest przykładem dynamicznego polimorfizmu. Pozwala użytkownikowi stworzyć abstrakcyjną klasę z częściową implementacją interfejsu.
Nadpisywanie metody uzyskuje się za pomocą dziedziczenia. Aby uzyskać metodę przesłaniającą zarówno klasę bazową, jak i klasę pochodną, należy mieć taką samą nazwę i parametr. W czasie kompilacji kompilator nie jest w stanie rozpoznać metody zastępującej, dlatego nie zgłasza żadnego błędu. Decyzja o uruchomieniu metody jest podejmowana w czasie wykonywania.
Przykład:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public void print() { Console.WriteLine('Printing from class Execute'); } public static void Main(string[] args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
Jeśli uruchomimy powyższy program, otrzymamy następujący wynik:
Printing from class Execute
Mimo że klasa Execute odziedziczyła wszystkie metody klasy Program, ale kiedy wywołaliśmy metodę print, która jest obecna w obu klasach, metoda obecna w klasie potomnej nadpisuje metodę z klasy nadrzędnej.
Do implementacji abstrakcji używany jest polimorfizm dynamiczny. Umożliwia użytkownikowi utworzenie klasy abstrakcyjnej, która jest używana do zapewnienia implementacji interfejsu, gdy jest dziedziczona przez klasę pochodną. Klasa abstrakcyjna może zawierać nazwy / podpisy metod, a klasa pochodna może mieć bardziej wyspecjalizowaną definicję metody.
Dziedzictwo
Dziedziczenie jest ważną częścią koncepcji OOPS. W dziedziczeniu definiujemy klasy nadrzędne i podrzędne. Klasa potomna może dziedziczyć wszystkie metody, obiekty i właściwości klasy nadrzędnej. Klasa potomna może również mieć własne metody i określoną implementację.
Klasa nadrzędna jest również nazywana klasą bazową, a klasa potomna, która dziedziczy klasę bazową, jest również nazywana klasą pochodną.
Przykład:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public static void Main(string[] args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
Tutaj mamy klasę nazwaną jako program, która ma jedną metodę. Mamy kolejną klasę Execute, która dziedziczy klasę Program. Klasa Execute jest klasą pochodną, a program klasy jest nazywany klasą bazową.
Teraz, zamiast tworzyć instancję obiektu dla programu klasy, stworzyliśmy instancję obiektu dla klasy Execute. Korzystając z tej instancji, możemy uzyskać dostęp do metody print z klasy bazowej.
Tak więc wynik powyższego kodu będzie:
Printing from class Program
Klasa pochodna nie tylko dziedziczy metody, ale także prawie wszystkich składowych klasy, takich jak pola, właściwości itp., W zależności od widoczności. Dziedziczenie w C # nie pozwala na używanie wielu dziedziczenia, tj. Jedna klasa nie może dziedziczyć z kilku różnych klas, jednak jedna klasa może dziedziczyć z innej klasy, która może dziedziczyć z innej klasy.
Abstrakcja
Abstrakcja jest jedną z głównych zasad programowania obiektowego. Abstrakcja pozwala programiście wyświetlać światu tylko niezbędne szczegóły, ukrywając inne. W języku C # abstrakcję uzyskuje się za pomocą klasy Abstract i interfejsu.
Klasę można zadeklarować jako klasę abstrakcyjną za pomocą słowa kluczowego „Abstract”. Klasa abstrakcyjna w języku C # jest zawsze klasą bazową w hierarchii. To, co odróżnia je od innych klas, polega na tym, że nie można ich utworzyć. Klasa abstrakcyjna C # musi być dziedziczona.
Przykład:
class Program { static void Main(string[] args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public void Describe() { return 'Description of the car'; } } class Hyundai : Car { }
Wynik następujących działań to:
Description of the car
Jeśli porównasz to z naszymi poprzednimi przykładami podczas dziedziczenia lub dynamicznego polimorfizmu, znajdziesz podobieństwa. Najbardziej rozpoznawalną różnicą jest użycie słowa kluczowego abstract przed klasą Car. Jeśli chcesz to zmienić lub dostarczyć własną implementację podobną do tego, co zrobiliśmy w dynamicznym polimorfizmie. Następnie możesz to osiągnąć w następujący sposób.
class Program { static void Main(string[] args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
Tak więc, jeśli teraz wykonasz ten kod, da on następujący wynik:
Description of the car is now Hyundai
Metoda klasy pochodnej przesłania metodę klasy bazowej. W ten sposób możesz stworzyć inną klasę pochodną, taką jak Ferrari, Porsche, BMW itp. Z własnymi metodami implementacji.
Jeśli przyjrzysz się uważnie, zobaczysz, że nasza metoda opisu w klasie abstrakcyjnej nie zawiera żadnej implementacji.
Dlaczego więc definiujemy puste metody?
Dzieje się tak, ponieważ klasa Abstract zawiera sygnaturę metod i zobowiązuje podklasy do tworzenia implementacji dla wszystkich tych metod. Umożliwia to udostępnianie klasy bazowej, ale jednocześnie sprawdza również implementację metody klasy pochodnej.
Berło
W języku C # interfejs jest planem klasy. Interfejs jest podobny do klasy abstrakcyjnej i służy do uzyskania stuprocentowej abstrakcji. Wszystkie metody opisane w interfejsie są domyślnie abstrakcyjne. Nie ma treści metody i nie można jej utworzyć.
Interfejs służy głównie do dziedziczenia wielokrotnego i pełnej abstrakcji. Wszystkie sygnatury metody zadeklarowane wewnątrz interfejsu powinny mieć implementację z klasy lub struktury, która ją implementuje.
Przykład:
class Program { static void Main(string[] args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } interface Car { string Describe(); } class Hyundai : Car { public string Describe() { return 'Description of the car is now Hyundai'; } }
Wynik powyższego kodu będzie:
Description of the car is now Hyundai
Tutaj stworzyliśmy interfejs Car. Ponieważ interfejs nie może mieć żadnej definicji metody, właśnie podaliśmy nazwę metody i typ zwracany w interfejsie. Następnie zaimplementowaliśmy interfejs Car do innej klasy Hyundai. W zaimplementowanej klasie podaliśmy definicję metod zdefiniowanych wewnątrz interfejsu.
Wniosek
W koncepcji programowania obiektowego każda część programu jest traktowana jako obiekt. Klasa to zbiór podobnych typów elementów, a obiekt jest instancją klasy.
Hermetyzacja w języku C # umożliwia użytkownikowi ustalenie widoczności klasy i jej elementów członkowskich. Polimorfizm pozwala, aby metody miały tę samą nazwę, ale z różnymi parametrami w tej samej klasie lub z tym samym parametrem w innej klasie.
Dziedziczenie ma miejsce, gdy klasa potomna, znana również jako klasa pochodna, dziedziczy wszystkie właściwości, w tym metody, obiekty, pola itp. Klasy nadrzędnej, znanej również jako klasa bazowa. Abstrakcja pozwala programowi wyświetlać tylko podpis, ukrywając szczegóły implementacji.
Skonsolidowany program
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i + j)); } void print(string a, string b) { Console.WriteLine('Printing String '+ a + b); } static void Main(string[] args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello', 'World'); Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
=> Zapoznaj się z całą serią samouczków szkoleniowych języka C # tutaj
rekomendowane lektury
- OOP Java: Wprowadzenie do programowania obiektowego w Javie
- Programowanie obiektowe w C ++
- Samouczek potoków w systemie Unix: Potoki w programowaniu w systemie Unix
- Python DateTime Tutorial z przykładami
- Repozytorium obiektów w QTP - samouczek nr 22
- Pojęcia dotyczące OOP w Pythonie (klasy Pythona, obiekty i dziedziczenie)
- Samouczek QTP nr 7 - Paradygmat identyfikacji obiektów QTP - Jak QTP jednoznacznie identyfikuje obiekty?
- Poznaj zaawansowane koncepcje tworzenia skryptów SoapUI Groovy - samouczek SoapUI nr 9