Полиморфизъм в C#
- Теория
- Код
C# предоставя възможности за абстракция и гъвкаво управление на кода чрез абстрактни класове, интерфейси и полиморфизъм.
Абстрактни Класове
Абстрактният клас е клас, от който не могат да се създават директни инстанции. Той често съдържа абстрактни методи без имплементация, които трябва да бъдат определени в класовете наследници.
Особености на Абстрактните Класове:
- Съдържат абстрактни методи без имплементация.
- Могат да включват конкретни методи с имплементация.
- Не могат да бъдат инстанцирани директно.
- Наследниците трябва да предоставят имплементация на абстрактните методи.
Пример:
public abstract class Animal {
public abstract void MakeSound();
public void Breathe() {
Console.WriteLine("I'm breathing.");
}
}
Интерфейси
Интерфейсите определят набор от методи и свойства, които класовете трябва да имплементират.
Основи на Интерфейсите:
- Интерфейсите могат да съдържат само декларации на методи и свойства.
- От C# 8.0, интерфейсите могат да съдържат default имплементации на методи.
- Не съдържат полета или конструктори.
Пример:
public interface IFlyable {
void Fly();
void Glide() {
Console.WriteLine("Gliding in the air.");
}
}
Полиморфизъм
Полиморфизмът позволява обектите да се третират като инстанции на техния базов клас или като инстанции на интерфейси, които имплементират.
Основи на Полиморфизма:
- Различни класове могат да имплементират един и същ интерфейс.
- Обектите могат да бъдат реферирани чрез референция на базов клас или интерфейс.
- Позволява гъвкавост и повторна употреба на код.
Пример:
public class Bird : IFlyable {
public void Fly() {
Console.WriteLine("Bird is flying.");
}
}
IFlyable myBird = new Bird();
myBird.Fly(); // Executes the Fly() method of Bird, even though the reference type is IFlyable.
Интересни Факти и Съвети
- Абстрактните класове и интерфейсите в C# предоставят рамка за
създаване на хиерархични и модуларни архитектури.
- C# поддържа множествено наследяване на интерфейси, но единично наследяване на класове.
- Полиморфизмът улеснява добавянето на нови функционалности без да се нарушава съществуващата функционалност.
Абстрактни класове
Абстрактните класове в C# са класове, от които не можем да създаваме директни инстанции. Те често служат като базови класове за наследяване.
Пример:
abstract class Shape {
public abstract double Area();
}
class Circle : Shape {
public double Radius;
public Circle(double radius) {
this.Radius = radius;
}
public override double Area() {
return Math.PI * Radius * Radius;
}
}
Интерфейси
Интерфейсите в C# определят набор от методи и свойства, които даден клас може да имплементира. Те представляват "договор", който класовете трябва да спазят.
Пример:
interface ITalkative {
void Talk();
void IntroduceAsTalkative() {
Console.WriteLine("I can talk!");
}
}
class Person : ITalkative {
public void Talk() {
Console.WriteLine("Hello!");
}
}
Обяснение: Интерфейсите в C# позволяват на различни класове да споделят общи методи. Те са полезни за създаване на модуларен и полиморфичен код.
Полиморфизъм
Полиморфизмът в C# означава, че един обект може да се третира като инстанция на своя базов клас или като инстанция на интерфейс, който той имплементира.
Пример:
Shape myCircle = new Circle(5);
Console.WriteLine("The area of the circle is: " + myCircle.Area());
ITalkative person = new Person();
person.Talk();
Задачи:
1. Класове
Задача: Създайте клас Book
със свойства Title
и Author
. Добавете метод Read()
, който извежда "Reading [Title] by [Author]".
Решение:
class Book {
public string Title;
public string Author;
public Book(string title, string author) {
this.Title = title;
this.Author = author;
}
public void Read() {
Console.WriteLine($"Reading {Title} by {Author}");
}
}
2. Абстрактни класове
Задача: Създайте абстрактен клас Animal
с абстрактен метод MakeSound()
. Създайте производни класове Cat
и Dog
, които имплементират метода MakeSound()
.
Решение:
abstract class Animal {
public abstract void MakeSound();
}
class Cat : Animal {
public override void MakeSound() {
Console.WriteLine("Meow, meow!");
}
}
class Dog : Animal {
public override void MakeSound() {
Console.WriteLine("Woof, woof!");
}
}
3. Интерфейси
Задача: Създайте интерфейс ISwimmable
с метод Swim()
. Създайте клас Fish
, който имплементира ISwimmable
.
Решение:
interface ISwimmable {
void Swim();
}
class Fish : ISwimmable {
public void Swim() {
Console.WriteLine("The fish is swimming.");
}
}
4. Полиморфизъм
Задача: Използ
вайте класовете и интерфейсите от предишните задачи, за да демонстрирате полиморфизъм.
Решение:
public class Demo {
public static void Main() {
Animal myAnimal = new Cat();
myAnimal.MakeSound(); // Outputs "Meow, meow!"
ISwimmable myFish = new Fish();
myFish.Swim(); // Outputs "The fish is swimming."
}
}