Спадковість. 🐸 Як жаба мріяла стати ссавцем
Сцена 1: Базова структура класів
public abstract class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public abstract void MakeSound();
}
public class Mammal : Animal
{
public virtual void GiveBirth()
{
Console.WriteLine("Народжую живого дитинча");
}
}
public class Amphibian : Animal
{
public virtual void LayEggs()
{
Console.WriteLine("Відкладаю ікру");
}
}
Сцена 2: Спроба змінити природу
public class Frog : Mammal
{
public override void MakeSound()
{
Console.WriteLine("Ква-муррр!");
}
public override void GiveBirth()
{
throw new NotImplementedException();
}
}
Компілятор: "CS0535: 'Frog' does not implement inherited abstract member 'Mammal.GiveBirth()'"
Сцена 3: Правильний підхід через інтерфейси
public interface ISwimmer
{
void Swim();
}
public interface IJumper
{
void Jump();
}
public class Frog : Amphibian, ISwimmer, IJumper
{
public override void MakeSound()
{
Console.WriteLine("Ква-ква!");
}
public void Swim()
{
Console.WriteLine("Пливу як професіонал!");
}
public void Jump()
{
Console.WriteLine("Стрибаю на 2 метри!");
}
}
🔗 Наслідування
Клас може успадковувати від іншого класу, отримуючи його властивості та методи
🎭 Поліморфізм
Можливість використовувати об'єкти різних класів через спільний інтерфейс
📦 Інкапсуляція
Приховування внутрішньої реалізації та надання публічного інтерфейсу
💡 Мораль історії:
"Краще бути першою жабою, ніж останнім ссавцем!"
У світі OOP кожен клас має своє унікальне призначення. Спробувати змінити фундаментальну природу об'єкта - це шлях до помилок компіляції та архітектурних проблем!
🎯 Висновки для розробника:
- Використовуйте наслідування для створення ієрархій "is-a" відношень
- Інтерфейси дозволяють реалізувати поведінку, не пов'язану з ієрархією наслідування
- Кожен клас повинен мати чітку відповідальність
- Дотримуйтесь принципу єдиного обов'язку (Single Responsibility)