Created
October 7, 2025 10:40
-
-
Save sunmeat/3dddb368c12b11777ea8ad1d89a0d0a1 to your computer and use it in GitHub Desktop.
всі можливі компоненти інтерфейсу в .Net 9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Text; | |
namespace InterfacesDemo | |
{ | |
// приклад демонструє всі можливості інтерфейсів у c# 13 / .net 9: константи, властивості, методи (абстрактні, з реалізацією, приватні, статичні), події, індексатори, внутрішні типи (enum, struct, class, interface) | |
interface IEntity | |
{ | |
// константа: статичне незмінне поле | |
const int MaxLevel = 100; | |
// автовластивість: абстрактна, реалізується в класі | |
public string? Name { get; set; } | |
// звичайна властивість з реалізацією: доступна для реалізації | |
public string Description | |
{ | |
get => $"Сущність: {Name}"; | |
set => Name = value ?? "Невідомо"; | |
} | |
// індексатор: абстрактний | |
public int this[int index] { get; set; } | |
// подія: абстрактна, реалізується в класі (це ще буде) | |
public event Action<string> OnUpdate; | |
// абстрактний метод: без тіла, обов'язково реалізувати | |
public abstract void Update(); | |
// публічний метод з реалізацією: default implementation (з c# 8), віртуальний | |
public void Log(string message) | |
{ | |
Console.WriteLine($"Лог: {message}"); | |
} | |
// приватний метод з реалізацією: доступний тільки всередині інтерфейсу (з c# 8) | |
private void InternalValidate(string value) | |
{ | |
if (string.IsNullOrEmpty(value)) throw new ArgumentException("Значення не може бути порожнім"); | |
} | |
// статичний абстрактний метод: для статичного поліморфізму (з c# 11), реалізується статично в класі | |
public static abstract string GetTypeName(); | |
// статичний метод з реалізацією: доступний без екземпляра | |
public static void StaticLog(string message) | |
{ | |
Console.WriteLine($"Статичний лог: {message}"); | |
} | |
// внутрішній enum: перелік станів | |
public enum State | |
{ | |
Idle, | |
Active, | |
Destroyed | |
} | |
// внутрішня struct: проста структура даних | |
public struct Position | |
{ | |
public int X { get; set; } | |
public int Y { get; set; } | |
public Position(int x, int y) | |
{ | |
X = x; | |
Y = y; | |
} | |
} | |
// внутрішній class: вкладений клас | |
public class Component | |
{ | |
public string Type { get; set; } = "Базовий"; | |
public void Process() => Console.WriteLine($"Обробка компонента: {Type}"); | |
} | |
// внутрішній interface: вкладений інтерфейс | |
public interface IUpgradable | |
{ | |
void Upgrade(); | |
} | |
} | |
// реалізація інтерфейсу: демонструє використання всіх елементів | |
class Creature : IEntity, IEntity.IUpgradable | |
{ | |
public string? Name { get; set; } | |
public int this[int index] | |
{ | |
get => index switch | |
{ | |
0 => Health, | |
1 => Level, | |
_ => 0 | |
}; | |
set | |
{ | |
switch (index) | |
{ | |
case 0: Health = value; break; | |
case 1: Level = value; break; | |
} | |
} | |
} | |
public event Action<string>? OnUpdate; | |
public int Health { get; set; } = 100; | |
public int Level { get; set; } = 1; | |
// реалізація абстрактного методу | |
public void Update() | |
{ | |
Health = Math.Max(0, Health - 10); | |
} | |
// статична реалізація абстрактного методу | |
public static string GetTypeName() => "Створіння"; | |
// реалізація вкладеного інтерфейсу | |
public void Upgrade() | |
{ | |
Level++; | |
Console.WriteLine($"Оновлення рівня для {Name} до {Level}"); | |
} | |
} | |
class Program | |
{ | |
static void Main() | |
{ | |
Console.OutputEncoding = Encoding.UTF8; | |
Creature creature = new() { Name = "Дракончик" }; | |
creature[0] = 80; // встановлення здоров'я через індексатор | |
creature[1] = 5; // встановлення рівня | |
Console.WriteLine($"Максимальний рівень: {IEntity.MaxLevel}"); | |
Console.WriteLine($"Ім'я за індексатором: {creature[0]} (здоров'я)"); | |
creature.OnUpdate += msg => Console.WriteLine($"Подія: {msg}"); | |
IEntity.StaticLog("Статичний виклик"); | |
Console.WriteLine($"\nТип: {Creature.GetTypeName()}"); | |
IEntity.Component component = new() { Type = "Політ" }; | |
component.Process(); | |
IEntity.State state = IEntity.State.Active; | |
Console.WriteLine($"Стан: {state}"); | |
IEntity.Position pos = new(10, 20); | |
Console.WriteLine($"Позиція: ({pos.X}, {pos.Y})"); | |
creature.Update(); | |
// використання вкладеного інтерфейсу | |
((IEntity.IUpgradable)creature).Upgrade(); | |
Console.WriteLine("\nВсі можливості інтерфейсів продемонстровано."); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment