C# та Об’єктно-орієнтоване програмування (OOP)

Вітаю всіх! Після деякої паузи вирішив повторити ООП (Об'єктно-орієнтоване програмування), і під час цього повторення захотів написати короткий оглядовий пост на Medium. Дякую всім, хто читає та оцінює! Якщо готові, давайте почнемо:

pic

На зображенні ви можете побачити терміни, які використовуються в ООП. В наступних частинах статті я поясню, що кожен з них означає.

Що таке Object Oriented Programming (ООП)?

Object-Oriented Programming, або об'єктно-орієнтоване програмування, є однією з основних парадигм програмування, яка використовується в розробці програмного забезпечення. В рамках цієї парадигми реальні об'єкти моделюються через концепцію "об'єктів". Об'єкти складаються з даних (атрибути) та поведінки (методи).

Наприклад, уявімо собі автомобіль: він має такі характеристики, як колір, модель і швидкість (атрибути) та поведінку, як-от рухатися або зупинятися (методи). ООП дозволяє організувати програму навколо таких об'єктів і розвивати її.

Що таке Class?

Клас — це структура, що описує властивості (атрибути) та поведінку (методи) об'єктів.

pic

Створюємо клас

Як ви бачите, в класі Car є два властивості brand та fuel, також є public поле x і private поле y (я поясню різницю між полем та властивістю пізніше), а також метод calculateDistance і конструктор Car(), який є спеціальним методом для створення об'єкта.

До класу можна додавати будь-які поля та методи.

Клас має свій конструктор. Коли об'єкт класу створюється, спочатку викликається конструктор. Конструктори використовуються для ініціалізації класу (наприклад, для привласнення значень змінним). Можна також визначити декілька конструкторів — це називається перевантаженням конструктора. У цьому випадку викликається той конструктор, який відповідає переданим параметрам.

Якщо конструктор не задано явно, C# автоматично створить його у фоновому режимі.

За замовчуванням доступ до класів має internal доступ (клас може бути або Internal, або Public; інші модифікатори доступу використовувати неможливо!).

pic

Тут ми створюємо об'єкт класу Car, за допомогою якого можемо доступитися до полів і методів. Оскільки поле y є private, ми не можемо звертатися до нього без помилки.

Що таке STATIC?

Static — це ключове слово, яке дозволяє звертатися до елементів класу без необхідності створювати об'єкт цього класу. Наприклад:

pic

Я створив клас Student і додав до його полів, властивостей та методів ключове слово static. Тепер я можу звертатися до цих змінних без створення об'єкта класу.

pic

Завдяки static ми можемо звертатися до полів класу без створення об'єкта

Модифікатори доступу

В мові програмування C# для забезпечення безпеки проектів потрібно обмежити доступ до класів. Для цього використовуються модифікатори доступу (access modifiers), які визначають рівень доступу до елементів класу.

PUBLIC: Найширший рівень доступу. До елементів, помічених як public, можна звертатися як зсередини класу, так і зовні.

PRIVATE: Найбільш обмежений рівень доступу.
Не можна отримати доступ до класів з інших класів або ззовні.

PROTECTED: Доступний лише для самого класу та наступних (наслідуваних) підкласів. Неможливо доступитися з main, тільки зсередини класу.

INTERNAL: Доступний тільки з класів та коду в межах одного проекту (assembly).

pic

Ці чотири поняття є основою ООП, давайте почнемо з наслідування (Inheritance).

INHERITENCE (Калітім)

Створимо наш клас знову:

pic

Я налаштував клас таким чином і в цьому прикладі додав параметри в конструктор, щоб це було інше, ніж у попередньому прикладі.

Inheritance (Наслідування) — це процес передачі властивостей та методів одного класу до іншого в об'єктно-орієнтованому програмуванні (ООП). Тобто, один клас може успадковувати члени іншого класу (властивості та методи), отримуючи їх функціональність. Наслідування здійснюється за допомогою символу “:”.

УВАГА! При передачі параметра в конструктор я використовую ключове слово this, щоб передати значення з параметра до властивості класу. Оскільки імена параметрів конструктора і змінних класу різні, використання this не є обов'язковим. Якщо імена збігаються, наприклад, конструктор мав би вигляд public Car(string brand, int fuel, int year), тоді для уникнення плутанини ми використали б this.

pic

Тут ми створили клас Mercedes і змусили його успадкувати клас Car. Mercedes, успадкувавши Car, автоматично отримує доступ до конструктора Car. Я не додав спеціальних змінних для Mercedes і налаштував клас таким чином, щоб він мав такі ж властивості, як і клас Car. Однак я додав метод justForMercedes().

Завдяки цьому, навіть якщо метод information() не написаний у класі Mercedes, він буде мати доступ до властивостей brand, fuel та year, а також до методу justForMercedes().

УВАГА! Коли об'єкт створюється з класу-наступника, спочатку викликається конструктор базового класу, а потім — конструктора класу-наступника.

pic

Також ми маємо доступ до методу information(), хоча я не показував цього.

УВАГА! C# не підтримує множинне наслідування, воно можливе лише через INTERFACE.

Virtual і Override (Перевантаження та перевизначення методів)

pic

Підкласи можуть змінювати методи або властивості, успадковані від базового класу, відповідно до своїх потреб, як у цьому прикладі.

У базовому класі я створив метод voice(). Клас Cat змінив цей метод, щоб він відтворював кітячий звук.

Для такого використання в базовому класі потрібно поставити ключове слово virtual перед методом чи властивістю, яку ми хочемо перевизначити, інакше це буде неможливо. Потім підклас повинен використовувати override при перевизначенні цього методу. Ключове слово override може стояти перед або після модифікатора доступу — це не має значення.

ENCAPSULATION (Інкапсуляція)

Encapsulation (Інкапсуляція) є однією з основних принципів об'єктно-орієнтованого програмування (ООП). Інкапсуляція передбачає захист даних (поля) і методів (методи) класу від прямого доступу ззовні. Це дозволяє забезпечити доступ до цих даних лише через контрольовані та безпечні механізми.

Іноді ми хочемо заблокувати прямий доступ до даних класу і дозволити доступ до них лише за певними правилами або умовами.
İşte bu yüzden Encapsulation (Інкапсуляція) kullanırız.

pic

Property-Field

Burada balance bir field’dır. Field’lar, get ve set metotları yoktur çünkü field’lar sadece veri saklamak için kullanılır. Field’lar veriye doğrudan erişimi mümkün kılar, ancak bu veriye herhangi bir işlem veya doğrulama uygulamaz. Bu nedenle, genelde field’lar Private olarak tanımlanır.

Burada Balance bir propertydir. Property’ler, bir field’a erişimi kontrol etmek için kullanılan özel yapılardır. get ve set metotları sayesinde, bir field’ın değerine erişmek veya bu değeri değiştirmek mümkün olur. Property’ler genellikle Public olur. Property’ler, veriye doğrudan erişim yerine kontrollü bir erişim sağlar ve bu sayede doğrulama veya iş mantığı eklenebilir. Bu durum, hem veri güvenliğini artırır hem de sınıfın iç yapısını soyutlar.

Şimdi property’ler ile nasıl kontrollü erişim yapıldığını bir örnek üzerinde görelim;

pic

Mesela burada balance field’ını private yaptım, Balance property’ini de public yaptım. Burada farklı yaptığım şey set’in önüne private yazdım. Bu BankAccount (Банківський рахунок) class’ından nesne üretildiğinde Balance’ın değerinin okunabilmesini fakat değerinin değiştirilmemesini sağlar şu şekilde;

pic

bankAccount.Balance ekrana yazdırılıyor fakat değerini değiştirmeye çalıştığımızda hata veriyor çünkü set’i private olarak ayarladık, gördüğünüz gibi Encapsulation (Інкапсуляція) bu şekilde property’lere müdahale etmemizi sağlar.

Bir örnek daha yapalım;

pic

Burada private bir age (вік) belirledim çünkü dışardan erişilmesini istemiyorum sadece değer ataması yapacağım, Age adında da bir property oluşturdum. get kısmında sadece age’i return ediyor, set kısmında ise yaşın 0’dan küçük olmama durumunun kontrolünü yapıyor. 0’dan küçükse ekrana mesaj yazdırıyor.

pic

Burada sorunsuz bir şekilde atamayı yapıyor

pic

Burada ise 0'dan küçük bir yaş girdiğimiz için çalıştırdığımızda hata mesajını ekrana veriyor

Peki Property veya Field Kullanacağız?

Basit bir şekilde özetlemek gerekirse;

Field’lar (Поля), sadece veri saklamak için kullanılır ve doğrudan erişilebilirler. Property’ler (Властивості) ise veri üzerinde doğrulama, mantık eklemek ve dışarıdan erişimi kontrollü hale getirmek için kullanılır, bu sayede daha güvenli ve esnek veri yönetimi sağlar.

Buraya kadar okuduğunuz için teşekkürler, bu yazımda OOP’yi (Об'єктно-орієнтоване програмування) giriş yapıp ilerlemiş olduk. Diğer yazılarımda Polymorphism (Поліморфізм), Abstraction (Абстракція) ve Interface (Інтерфейс) kavramları ile devam edeceğim, onları da okuyup beğenirseniz sevinirim. Diğer yazılarda görüşmek üzere…

https://www.linkedin.com/in/erenctns/

[

erenctns — Overview

Computer Engineering Student. erenctns has 9 repositories available. Follow their code on GitHub.

github.com

](https://github.com/erenctns?source=post_page-----24ec45787edf--------------------------------)

Перекладено з: C# ile Object Oriented Programming(OOP)

Leave a Reply

Your email address will not be published. Required fields are marked *