-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
418 lines (381 loc) · 13.8 KB
/
Program.cs
File metadata and controls
418 lines (381 loc) · 13.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
/*
* Author: Nikolay Dvurechensky
* Site: https://dvurechensky.pro/
* Gmail: dvurechenskysoft@gmail.com
* Last Updated: 27 апреля 2026 09:40:39
* Version: 1.0.254
*/
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");
}
}