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");
}
}