Skip to content

Instantly share code, notes, and snippets.

@sunmeat
Created October 7, 2025 10:40
Show Gist options
  • Save sunmeat/3dddb368c12b11777ea8ad1d89a0d0a1 to your computer and use it in GitHub Desktop.
Save sunmeat/3dddb368c12b11777ea8ad1d89a0d0a1 to your computer and use it in GitHub Desktop.
всі можливі компоненти інтерфейсу в .Net 9
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