410 lines
14 KiB
C#
410 lines
14 KiB
C#
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");
|
||
}
|
||
} |