using Newtonsoft.Json; using static Base.Records; namespace Base; /// /// Важно: ссылочные типы лежат в куче, значимые - ссылка в куче, значение в стеке /// *** /// Шаблон, по которому определяется форма объекта /// Определение: /// Класс - это ссылочный тип данных, шаблон по которому определяется объект, информацию о себе хранит в куче. /// 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(json); Console.WriteLine(otherSideRecord); Records = Records with { Id = 10 }; Console.WriteLine(Records); Console.ReadKey(); } } /// /// Абстракция которая отвечает за контракт взаимодействия для различных типов /// Определение: /// Интерфейс - это ссылочный тип данных, представляющий контракт взаимодействия (поведение). /// Этот контракт гласит о том что должен содержать class или struct. /// Формирует общий признак для разнородных объектов /// public interface IInterTest { /// /// Декларация - метод без реализации по умолчанию /// /// void Build(int build = 0); /// /// После C# 8.0 можно указывать реализацию метода в интерфейсе /// void Relocate() { Console.WriteLine("-> IInterTest: Relocate"); } /// /// Cигнатура - операция без реализации - абстрактный метод /// abstract void Reload(); /// /// Делегат - ссылочный тип /// delegate void Destiny(); /// /// Cвойство - ссылочный тип /// string Name { get; set; } /// /// Cвойство - ссылочный тип /// object ID { get; set; } } /// /// Абстрактный класс /// Определение: /// Абстрактный класс - это ссылочный тип данных, для описания общности сущностей, которые не имеют конкретного воплощения /// public abstract class AbstrTest { /// /// Поле /// public int key = 100; /// /// Свойство /// public string Name { get; set; } /// /// Конструктор без параметров /// public AbstrTest() { key = 110; Name = "Fire"; Console.WriteLine($"->AbstrTest {Name} {key}"); } /// /// Конструктор с параметрами /// /// ключ public AbstrTest(int key) { this.key = key; Name = "Fire"; Console.WriteLine($"->AbstrTest {Name} {key}"); } /// /// Метод - это фиксированная операция с реализацией по умолчанию /// public void Move() { Console.WriteLine("Move Abstr"); } /// /// Виртуальный метод - операция с реализацией по умолчанию /// public virtual void Resize() { Console.WriteLine("Resize Abstr"); } /// /// Абстрактный метод - сигнатура - операция без реализации /// public abstract void Open(); } /// /// Определение: /// Структура - это значимый тип данных, ссылка на структуру хранится в куче, значение в стеке /// Тот же класс, меняется тип данных /// public struct TestStruct : IInterTest { /// /// Свойство имени /// public string Name { get; set; } /// /// Свойство идентификатора /// public object ID { get; set; } /// /// Конструктор без параметров /// public TestStruct() { Name = "Base"; ID = (object)0; } /// /// Метод с реализацией с параметрами /// /// # public void Build(int build = 0) { Console.WriteLine($"Build TestStruct {build}"); } /// /// Метод с реализацией без параметров /// public void Reload() { Console.WriteLine("Reload TestStruct"); } } /// /// Реализация поведения класса /// public class ClassMain : AbstrTest, IInterTest { /// /// Свойство /// public int countBuild { get; set; } /// /// Свойство от интерфейса /// public string Name { get; set; } /// /// Свойство от интерфейса /// public object ID { get; set; } /// /// Конструтор + реализация поведения конструктора абстрактного класса /// 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(); } /// /// Конструтор c параметрами + реализация поведения конструктора абстрактного класса /// /// # /// # /// # public ClassMain(int build, string name, object id) : base(build) { countBuild = build; Name = name; ID = id; Move(); Build(build); Reload(); Resize(); Open(); } /// /// Виртуальный метод /// public virtual void GG() { Console.WriteLine("GG Virtual Method Class"); } /// /// Метод с параметрами /// /// # public void Build(int build = 0) { Console.WriteLine($"Build Interface Class {build}"); } /// /// Метод без параметров обязательный к реализации от интерфейса /// public void Reload() { Console.WriteLine("Reload Interface Abstract Method Class"); } /// /// Реализация virtual метода абстрактного класса /// public override void Resize() { base.Resize(); countBuild--; Console.WriteLine("Resize Class"); } /// /// Переопределение сигнатуры абстрактного класса /// public override void Open() { Console.WriteLine("Open Abstract Method Class"); } /// /// Реализация деструктора класса /// ~ClassMain() { Console.WriteLine("###Destroy ClassMain"); } } /// /// Реализация наследования (3 принцип ООП) /// Определение: /// Наследование - это возможность создания новых абстракций на основе существующих. /// Наследование является ключевой функцией объектно-ориентированных языков программирования. /// Оно позволяет определить базовый класс для определенных функций (доступа к данным или действий), /// а затем создавать производные классы, которые наследуют или переопределяют функции базового класса. /// public class Nasled : ClassMain { /// /// Необязательное перепределение виртуального метода главного класса /// public override void GG() { base.GG(); } } /// /// Определение: /// Records - это ссылочный тип, некая модификация возможностей классов /// Ключевая особенность - может представлять неизменяемый тип данных (immutable) /// Также имеет особенность в виде встроенного JSON представления при выводе в строку /// Имеет возможность управлять своим деконструктором /// public record class Records { /// /// Свойство идентификатора /// public int Id { get; init; } /// /// Свойство имени /// public string Name { get; init; } /// /// Конструктор с параметрами /// /// идентификатор /// имя 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; } /// /// Деконструктор /// /// имя /// идентификатор 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; } /// /// Деконструктор /// /// имя /// идентификатор 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; } /// /// Деконструктор /// /// имя /// идентификатор public void Deconstruct(out string name, out int id) { name = Names; id = Ida; Console.WriteLine("Destruct Job"); } }