PatternsCSharpProgramming/Patterns/Base/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

410 lines
14 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Newtonsoft.Json;
using static Base.Records;
namespace Base;
/// <summary>
/// Важно: ссылочные типы лежат в куче, значимые - ссылка в куче, значение в стеке
/// ***
/// Шаблон, по которому определяется форма объекта
/// Определение:
/// Класс - это ссылочный тип данных, шаблон по которому определяется объект, информацию о себе хранит в куче.
/// </summary>
class Program
{
static void Main()
{
var person = new Person() //реализация record сборки разборки
{
Id = 1,
Name = "john"
};
Console.WriteLine(person.ToString());
var job = new Job()
{
Ida = 786897980,
Names = "Address"
};
Console.WriteLine(job.ToString());
var gl = new GlobalInfo();
person.Deconstruct(out gl.Name, out gl.Id);
job.Deconstruct(out gl.Names, out gl.Ida);
Console.WriteLine($"{gl.Name}/{gl.Names}/{gl.Id}/{gl.Ida}");
IInterTest interTest = new ClassMain();
interTest.ResizeExt(); //методы static
interTest.Relocate(); //метод объявлен и реализован в самом интерфейсе
var Records = new Records(1, "rec1"); //экзмепляр Records (аналог class)
var (NameS, idS) = Records; //можно разложить record на переменные
var RecNew = Records with { Name = "rec2" };//можно инициализировать другой класс на основе данных первого
Console.WriteLine($"{NameS} {idS}");
var (NameS2, idS2) = RecNew; //можно разложить record на переменные
Console.WriteLine($"{NameS2} {idS2}");
Console.WriteLine(Records == RecNew); //можно сравнить record обычными операторами сравнения
Console.WriteLine();
Console.WriteLine(RecNew); //можно напечать JSON представление содержимого record по умолчанию
Console.WriteLine(Records); //можно напечать JSON представление содержимого record по умолчанию
var json = JsonConvert.SerializeObject(Records, Formatting.Indented);
Console.WriteLine(json);
var otherSideRecord = JsonConvert.DeserializeObject<Records>(json);
Console.WriteLine(otherSideRecord);
Records = Records with { Id = 10 };
Console.WriteLine(Records);
Console.ReadKey();
}
}
/// <summary>
/// Абстракция которая отвечает за контракт взаимодействия для различных типов
/// Определение:
/// Интерфейс - это ссылочный тип данных, представляющий контракт взаимодействия (поведение).
/// Этот контракт гласит о том что должен содержать class или struct.
/// Формирует общий признак для разнородных объектов
/// </summary>
public interface IInterTest
{
/// <summary>
/// Декларация - метод без реализации по умолчанию
/// </summary>
/// <param name="build"></param>
void Build(int build = 0);
/// <summary>
/// После C# 8.0 можно указывать реализацию метода в интерфейсе
/// </summary>
void Relocate()
{
Console.WriteLine("-> IInterTest: Relocate");
}
/// <summary>
/// Cигнатура - операция без реализации - абстрактный метод
/// </summary>
abstract void Reload();
/// <summary>
/// Делегат - ссылочный тип
/// </summary>
delegate void Destiny();
/// <summary>
/// Cвойство - ссылочный тип
/// </summary>
string Name { get; set; }
/// <summary>
/// Cвойство - ссылочный тип
/// </summary>
object ID { get; set; }
}
/// <summary>
/// Абстрактный класс
/// Определение:
/// Абстрактный класс - это ссылочный тип данных, для описания общности сущностей, которые не имеют конкретного воплощения
/// </summary>
public abstract class AbstrTest
{
/// <summary>
/// Поле
/// </summary>
public int key = 100;
/// <summary>
/// Свойство
/// </summary>
public string Name { get; set; }
/// <summary>
/// Конструктор без параметров
/// </summary>
public AbstrTest()
{
key = 110;
Name = "Fire";
Console.WriteLine($"->AbstrTest {Name} {key}");
}
/// <summary>
/// Конструктор с параметрами
/// </summary>
/// <param name="key">ключ</param>
public AbstrTest(int key)
{
this.key = key;
Name = "Fire";
Console.WriteLine($"->AbstrTest {Name} {key}");
}
/// <summary>
/// Метод - это фиксированная операция с реализацией по умолчанию
/// </summary>
public void Move()
{
Console.WriteLine("Move Abstr");
}
/// <summary>
/// Виртуальный метод - операция с реализацией по умолчанию
/// </summary>
public virtual void Resize()
{
Console.WriteLine("Resize Abstr");
}
/// <summary>
/// Абстрактный метод - сигнатура - операция без реализации
/// </summary>
public abstract void Open();
}
/// <summary>
/// Определение:
/// Структура - это значимый тип данных, ссылка на структуру хранится в куче, значение в стеке
/// Тот же класс, меняется тип данных
/// </summary>
public struct TestStruct : IInterTest
{
/// <summary>
/// Свойство имени
/// </summary>
public string Name { get; set; }
/// <summary>
/// Свойство идентификатора
/// </summary>
public object ID { get; set; }
/// <summary>
/// Конструктор без параметров
/// </summary>
public TestStruct()
{
Name = "Base";
ID = (object)0;
}
/// <summary>
/// Метод с реализацией с параметрами
/// </summary>
/// <param name="build">#</param>
public void Build(int build = 0)
{
Console.WriteLine($"Build TestStruct {build}");
}
/// <summary>
/// Метод с реализацией без параметров
/// </summary>
public void Reload()
{
Console.WriteLine("Reload TestStruct");
}
}
/// <summary>
/// Реализация поведения класса
/// </summary>
public class ClassMain : AbstrTest, IInterTest
{
/// <summary>
/// Свойство
/// </summary>
public int countBuild { get; set; }
/// <summary>
/// Свойство от интерфейса
/// </summary>
public string Name { get; set; }
/// <summary>
/// Свойство от интерфейса
/// </summary>
public object ID { get; set; }
/// <summary>
/// Конструтор + реализация поведения конструктора абстрактного класса
/// </summary>
public ClassMain() : base (0)
{
TestStruct testStruct = new TestStruct();
Console.WriteLine($"TestStruct: {testStruct.Name}, {testStruct.ID}");
Name = "Base";
ID = (object)0;
Move();
Build();
Reload();
Resize();
Open();
}
/// <summary>
/// Конструтор c параметрами + реализация поведения конструктора абстрактного класса
/// </summary>
/// <param name="build">#</param>
/// <param name="name">#</param>
/// <param name="id">#</param>
public ClassMain(int build, string name, object id) : base(build)
{
countBuild = build;
Name = name;
ID = id;
Move();
Build(build);
Reload();
Resize();
Open();
}
/// <summary>
/// Виртуальный метод
/// </summary>
public virtual void GG()
{
Console.WriteLine("GG Virtual Method Class");
}
/// <summary>
/// Метод с параметрами
/// </summary>
/// <param name="build">#</param>
public void Build(int build = 0)
{
Console.WriteLine($"Build Interface Class {build}");
}
/// <summary>
/// Метод без параметров обязательный к реализации от интерфейса
/// </summary>
public void Reload()
{
Console.WriteLine("Reload Interface Abstract Method Class");
}
/// <summary>
/// Реализация virtual метода абстрактного класса
/// </summary>
public override void Resize()
{
base.Resize();
countBuild--;
Console.WriteLine("Resize Class");
}
/// <summary>
/// Переопределение сигнатуры абстрактного класса
/// </summary>
public override void Open()
{
Console.WriteLine("Open Abstract Method Class");
}
/// <summary>
/// Реализация деструктора класса
/// </summary>
~ClassMain()
{
Console.WriteLine("###Destroy ClassMain");
}
}
/// <summary>
/// Реализация наследования (3 принцип ООП)
/// Определение:
/// Наследование - это возможность создания новых абстракций на основе существующих.
/// Наследование является ключевой функцией объектно-ориентированных языков программирования.
/// Оно позволяет определить базовый класс для определенных функций (доступа к данным или действий),
/// а затем создавать производные классы, которые наследуют или переопределяют функции базового класса.
/// </summary>
public class Nasled : ClassMain
{
/// <summary>
/// Необязательное перепределение виртуального метода главного класса
/// </summary>
public override void GG()
{
base.GG();
}
}
/// <summary>
/// Определение:
/// Records - это ссылочный тип, некая модификация возможностей классов
/// Ключевая особенность - может представлять неизменяемый тип данных (immutable)
/// Также имеет особенность в виде встроенного JSON представления при выводе в строку
/// Имеет возможность управлять своим деконструктором
/// </summary>
public record class Records
{
/// <summary>
/// Свойство идентификатора
/// </summary>
public int Id { get; init; }
/// <summary>
/// Свойство имени
/// </summary>
public string Name { get; init; }
/// <summary>
/// Конструктор с параметрами
/// </summary>
/// <param name="id">идентификатор</param>
/// <param name="name">имя</param>
public Records(int id, string name)
{
Id = id;
Name = name;
Console.WriteLine("Construct");
}
public class GlobalInfo
{
public int Id;
public string Name;
public int Ida;
public string Names;
}
/// <summary>
/// Деконструктор
/// </summary>
/// <param name="name">имя</param>
/// <param name="id">идентификатор</param>
public void Deconstruct(out string name, out int id)
{
name = Name;
id = Id;
Console.WriteLine("Destruct");
}
}
public record class Person
{
public int Id { get; init; }
public string Name { get; init; }
/// <summary>
/// Деконструктор
/// </summary>
/// <param name="name">имя</param>
/// <param name="id">идентификатор</param>
public void Deconstruct(out string name, out int id)
{
name = Name;
id = Id;
Console.WriteLine("Destruct Person");
}
}
public record class Job
{
public int Ida { get; init; }
public string Names { get; init; }
/// <summary>
/// Деконструктор
/// </summary>
/// <param name="name">имя</param>
/// <param name="id">идентификатор</param>
public void Deconstruct(out string name, out int id)
{
name = Names;
id = Ida;
Console.WriteLine("Destruct Job");
}
}