Skip to content

Instantly share code, notes, and snippets.

View sunmeat's full-sized avatar
🐈
MEOW

Oleksandr Zahoruiko sunmeat

🐈
MEOW
View GitHub Profile
@sunmeat
sunmeat / task.md
Created October 7, 2025 11:55
ДЗ на інтерфейси IComparer, IEnumerator та IEnumerable

Робота з інтерфейсами IComparer та IEnumerable

Мета

Ознайомитися з інтерфейсами IComparer<T> та IEnumerable<T> у C#, реалізувати сортування колекцій та ітерацію елементів. Розвинути навички створення вкладених класів-компараторів та реалізації ітераторів для власних типів.

1. Реалізація компараторів у класі Student

Додайте до класу Student вкладені (nested) класи, які реалізують інтерфейс IComparer<Student>:

  • AverageGradeComparer: сортує студентів за зростанням середнього балу (ascending). У разі рівних балів — за алфавітом ПІБ.
  • FullNameComparer: сортує студентів за ПІБ (прізвище + ім'я) в алфавітному порядку (case-insensitive). У разі однакового ПІБ — за середнім балом (descending).
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 11:49
явна реалізація IEnumerable та IEnumerator
using System.Collections;
using System.Text;
namespace EnumerableDemo
{
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
@sunmeat
sunmeat / Program.cs
Last active October 7, 2025 11:29
foreach та качина типізація
using System.Text;
namespace DuckTypingDemo
{
class Program
{
static void Main()
{
Console.OutputEncoding = Encoding.UTF8;
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 10:48
явна та неявна реалізація інтерфейсів C#
using System.Text;
namespace InterfacesDemo
{
// якщо клас реалізує два інтерфейси, що містять компонент з однаковою
// сигнатурою, то при реалізації цього компонента в класі обидва інтерфейси будуть
// використовувати цей компонент для своєї реалізації. в наступному прикладі
// всі виклики Paint викликають один метод:
interface IControl
{
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 10:40
всі можливі компоненти інтерфейсу в .Net 9
using System.Text;
namespace InterfacesDemo
{
// приклад демонструє всі можливості інтерфейсів у c# 13 / .net 9: константи, властивості, методи (абстрактні, з реалізацією, приватні, статичні), події, індексатори, внутрішні типи (enum, struct, class, interface)
interface IEntity
{
// константа: статичне незмінне поле
const int MaxLevel = 100;
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 10:33
IComparer example C#
using System.Text;
namespace Compare
{
class Monster
{
// класи-компаратори часто розміщують у тілі основного класу для інкапсуляції: доступ до приватних полів, видимість для клієнта (якщо public/internal)
public class NameComparer : IComparer<Monster>
{
public int Compare(Monster? x, Monster? y)
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 10:26
IComparable example C#
using System.Text;
namespace Compare
{
class Monster : IComparable<Monster>
{
public string Name { get; set; }
public int Health { get; set; }
public int Ammo { get; set; }
@sunmeat
sunmeat / Program.cs
Last active October 7, 2025 10:20
IClonable example C#
using System.Text;
namespace MakeClone
{
class Monster : ICloneable // public object Clone()
{
public string Name { get; set; }
public int Health { get; set; }
public int Mana { get; set; }
public int Ammo { get; set; }
@sunmeat
sunmeat / Program.cs
Created October 7, 2025 09:42
interface example C#
using System.Text;
// рекомендація: перед назвою типу інтерфейсу ставити велику літеру I
// також часто можна зустріти суфікс -able
interface IFlyable
{
void Fly();
}
// зазвичай в інтерфейсі НЕМАЄ ПОЛІВ, немає приватних методів і немає тіл у публічних методів
@sunmeat
sunmeat / task.md
Last active October 7, 2025 08:16
ДЗ на успадкування, поліморфізм, методи класу Object та extension-методи

Успадкування в .NET 9

  • Створіть базовий клас Person з полями FullName (string) та BirthDate (DateTime), базовими конструкторами з делегуванням, геттерами/сеттерами та віртуальним методом DisplayInfo() (виводить ПІБ та дату).
  • Зробіть Student похідним від Person (використовуйте : Person). Додайте конструктори з делегуванням до базового (: base(fullName, birthDate)).
  • Створіть похідний клас GraduateStudent від Student з додатковим полем ThesisTopic (string) та конструктором, що делегує до Student. Додайте геттер/сеттер для теми.

Поліморфізм

  • Зробіть DisplayInfo() віртуальним у Person. Перевизначте (override) його в Student (викликайте base.DisplayInfo() + виводьте адресу, телефон, оцінки). У GraduateStudent — ще + тема диплома.
  • У Group.DisplayStudents() використовуйте поліморфізм: зберігайте список як List або Person[] (щоб додавати GraduateStudent), і викликайте DisplayInfo() — має працювати для всіх похідних типів динамічно.