Классууд ба обьектууд

Өмнөх хичээлүүдээр бид өгөгдлийн төрлүүд, үйлдлүүд, цикл, нөхцөлт бүтэцүүд, массив, арга гээд C# програмчлалын хэлний суурь ойлголтуудыг үзсэн. C# бол бүрэн хэмжээний обьект хандлагат хэл. ОХП -ийн аргачлал орчин үед маш өргөн дэлгэрсэн тул өргөн дэлгэрсэн програмчлалын хэлүүд бүгд энэ парадигмийг дэмждэг. Энгийнээр ОХП -нь програмийг өөр хоорондоо харилцан холбогдож ажиллах обьектууд байдлаар зохиох аргачлал юм. Цаашид програмчлалын илүү нарийн ойлголтуудыг судлаж эхлэх учраас өмнөх хичээлүүдийг үзсэн байхыг зөвлөе.

Обьектийн тодорхойлолт бол класс харин обьект бол энэ классийн хувийг илэрхийлнэ. Жишээ нь бидэнд хүний тухай нэр, нас, хүйс, гарал үүсэл, үндэстэн гэх мэтээр тодорхой төсөөлөл бий. Өөрөөр хэлбэл ерөнхий хэв юм. Энэхүү хэвийг класс гэж нэрлэж болно. Хэвийн тодорхой биелэлүүд өөр өөр байж болно. Жишээ нь нэг хүний нэр, нас,өндөр нөгөөгөөсөө өөр байх гэх мэтээр. Бодит хүн бол энэ классийн хувь.
Өмнөх хичээлүүдэд бид классууд ашиглаж байсан. Жишээ нь мөрийг илэрхийлэх string төрөл бол үнэндээ бол класс. Эсхүл консолд мэдээлэл үзүүлэх WriteLine() аргатай Console ч бас класс.

Класс, обьект нь нилээд хийсвэрлэл өндөртэй ойлголтууд тул үгээр тайлбарлахад төвөгтэй. Иймд жишээгээр авч үзэх нь илүү.

Одоо өөрсдийн классийг хэрхэн үүсгэхийг харцгаая. Ер нь класс бол хэрэглэгч тодорхойлж буй шинэ төрөл бөгөөд сlass түлхүүр үгээр тодорхойлогдоно.

class классийн_нэр
{
    // классийн агуулга
}

class түлхүүр үгийн араас классийн нэрийг өгөөд цааш хаалтанд классийн агуулга байрлана. Жишээ нь Program.cs файлд хүнийг төлөөлөх Person классыг тодорхойлбол

class Person
{
 
}

байна. Гэхдээ ийм класс тийм ч ойлгомжтой биш тул түүнд зарим ажиллагааг нэмье.

Классийн талбар ба аргууд

Класс өгөгдлүүдийг хадгалж болох бөгөөд үүний тулд талбарыг хэрэглэдэг. Үнэндээ классийн талбар гэдэг нь классийн түвшинд зарлагдсан хувьсагч. Үүнээс гадна класст зарим биелэгдэх эсхүл хийгдэх үйлдлүүдийг тодорхойлох боломжтой. Классийн үйлдлийг тодорхойлохдоо аргуудыг хэрэглэнэ.
Ингээд Person класст талбар, аргуудыг

class Person 
{
    public string name = "Undefined";   // нэр
    public int age;                     // нас
 
    public void Print()
    {
        Console.WriteLine($"Нэр: {name}  Нас: {age}");
    }
}

нэмье. Дээрх кодоор Person класст нэр хадгалах name, нас хадгалах age талбаруудыг тодорхойлсон. Аргад тодорхойлогдох хувьсагчдаас классийн талбарууд модификатор /хандалтын боломж/ авч болдогоороо ялгаатай. Кодод талбарууд Person классийн гаднаас хандалттай байлгах үүднээс тэдгээрт public модификаторийг заан өгсөн байгаа. Талбарын тодорхойлолтод түүнд ямар нэгэн утгыг олгож болохыг name талбарын тодорхойлотоос харагдана. Хэрвээ классийн талбарт инициализац хийгээгүй бол тэдгээр нь төрлийнхөө анхдагч утгуудыг авна. Тоон төрлийн хувьсагчид энэ нь 0 байна.
Үүнээс гадна Person класст Print() аргыг тодорхойлсон. Классийн арга түүний талбаруудад хандах боломжтой бөгөөд кодод Print() арга name, age талбаруудын утгыг консолд гаргаж байгаа. Аргад классийн гаднаас хандах боломжийг олгох үүднээс түүнийг ч бас public модификатортой тодорхойлсон.

Классийн обьектыг үүсгэх

Классийн тодорхойлсоны дараа түүний обьектыг үүсгэх боломжтой. Обьектыг үүсгэхдээ байгуулагчийг (constructor) ашиглана. Байгуулагч нь класстай ижил нэртэй классийн шинэ обьектийг үүсгэхэд дуудагдан обьектийн инициализацийг хийдэг тусгай арга юм. Байгуулагч аргыг дуудах ерөнхий бичлэг.

new классийн_байгуулагч(параметрүүд);

байна. new оператор обьектод санах ой тусгаарлаад дараа нь байгуулагчийн дуудалтыг хийнэ.

Анхдагч байгуулагч

Класст (манай Person класс шиг) ямарч байгуулагч тодорхойлогдоогүй бол ямарч параметрүүд авдаггүй хоосон байгуулагч аргыг автоматаар үүсгэдэг.   
Person классийн обьектыг үүсгэе

Person tom = new Person();  // Person классийн обьектийг үүсгэх
// Person классийн тодорхойлолт
class Person
{
    public string name = "Undefined";
    public int age;
 
    public void Print()
    {
        Console.WriteLine($"Нэр: {name}  Нас: {age}");
    }
}

Person обьектыг үүсгэхдээ new Person() илэрхийллийг ашигласан. Илэрхийллээр Person обьектын бүх өгөгдлүүдийг хадгалах санах ойн хэсэг тусгаарлагдана. tom хувьсагч үүсгэгдсэн обьектын холбоосыг авах бөгөөд хувьсагчаар дамжуулан обьектын гишүүдэд хандан ашиглах боломжтой.

Классийн гишүүдэд хандах

Классийн гишүүдэд (талбар, арга гэх мэт) хандахдаа цэгийг ашиглана. Классийн обьектын (хувь) холбоосыг хадгалсан хувьсагчийн ард цэг тавиад дараа нь классийн элементийн нэрийг өгнө.  

объект.талбар
объект.арга(аргын параметрүүд)

Person классийн обьектийн элементүүдэд хандах жишээ

Person tom = new Person();  // Person классийн обьектыг үүсгэх
 
// Талбарын утгыг хувьсагчид авах
string personName = tom.name;
int personAge = tom.age;
Console.WriteLine($"Нэр: {personName} Нас {personAge}");   // Нэр: Undefined  Нас: 0
 
// талбарт шинэ утга олгох
tom.name = "Tom";
tom.age = 37;
 
// Print аргад хандах
tom.Print();    // Нэр: Tom  Нас: 37
 
class Person
{
    public string name = "Undefined";
    public int age;
 
    public void Print()
    {
        Console.WriteLine($"Нэр: {name}  Нас: {age}");
    }
}

Програм консолд

мэдээллийг үзүүлнэ.

Классийн тогтмол

Классийн талбарт тогтмол өгөгдлийг хадгалах тогтмолыг тодорхойлж болно. Талбараас ялгаатай нь тогтмолыг талбарын тодорхойлолтод нэг удаа шууд тавьдаг бөгөөд дараа нь утгыг өөрчлөх боломжгүй. Тогтмолууд ганцхан обьектод биш бүх класст хамааралтай өгөгдлийг хадгалдаг. Тогтмолд обьектын нэрээр биш классийн нэрээр ханддаг. Жишээ нь

Person tom = new Person();
tom.name = "Tom";
tom.age = 37;
tom.Print();    // Person: Tom - 37
 
Console.WriteLine(Person.type); // Person
// Person.type = "User";    // !Алдаа: тогтмолыг өөрчилж болохгүй
 
class Person
{
    public const string type = "Person";
    public string name = "Undefined";
    public int age;
    public void Print() => Console.WriteLine($"{type}: {name} - {age}");
}

Person класст классийн нэрийг хадгалах type тогтмолыг тодорхойлсон.

public const string type = "Person";

Классийн нэр обьектоос хамаарахгүй. Person классаас олон обьектийг үүсгэж болох ч классийн нэр өөр болох ёсгүй бөгөөд Person классийн бүх обьект ижил. Иймээс төрлийн нэрийг тогтмолд хадгалах боломжтой. Тогтмолд түүний тодорхойлолтод шууд утгыг олгох ёстойг сануулъя. Классийн дотроос тогтмолд ердийн талбарууд шиг хандах боломжтой. Жишээ нь

Console.WriteLine(Person.type); // Person

гэж Print аргаас тогтмолын утгыг консолд үзүүлж болно. Гэхдээ классийн гаднаас тогтмолд хандах болбол классийн нэрийг ашиглах хэрэгтэй. Жишээ нь    

Console.WriteLine(Person.type); // Person

Бүх класст хамааралтай өгөгдлийг хадгалах хэрэгтэй бол тогтмолыг ашиглаж болно.

Visual Studio -д классийг нэмэх

Классуудыг голдуу тусдаа файлд хадгалдаг. Нэг класс нэг файлд байх нь элбэг. Visual Studio боловсруулалтын орчинд классийн анхдагч хэвийг оруулан өгсөн байдаг.
Visual Studio -д класс нэмэхдээ төслийн нэр дээр баруун даралт хийхэд

нээгдэх цэсний Add -> New Item... (эсхүл Add -> Class...) командуудыг сонговол Add New Item

дэлгэц нээгдэнэ. Шинэ элемент нэмэх цонхны дунд орших элементүүдийн хэвүүдээс (шаблон) Class -ийг сонгоод Name талбарт нэмж буй классийнхаа нэрийг өгөөд Add товчийг дарна.
Классийн нэрийн талбарт Person эсхүл Person.cs гэсэн ч болох бөгөөд Add товчийг дарсаны дараа төсөлд

Person.cs нэртэй файл нэмэгдэнэ. Person.cs файлд нэг талбартай Print аргатай

class Person
{
    public string name = "Undefined";
    public void Print()
    {
        Console.WriteLine($"Person {name}");
    }
}

классийг тодорхойлъё. Үндсэн Program.cs файлд Person классийн хувийг үүсгээд

using ConsoleApp1;
Person tom = new Person();
tom.name = "Tom";
tom.Print();    // Person Tom

Програмаа ажлуулбал

үр дүнг өгнө. Ингэснээр бид классийг тусдаа файлд тодорхойлоод түүнийг програмдаа ашиглахыг сурлаа.

Жич: Эхэн үедээ ОХП төвөгтэй мэт санагдаж магадгүй ч та хичээвэл тийм ч хүнд биш гэдэгт итгээрэй.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 101 Нийтийн

Нэг ерөнхийлөлтэй класс өөр ерөнхийлөлтэй классаас удамшиж болно. Ингэхдээ удамшилтын төрөл бүрийн хувилбаруудыг ашиглах боломжтой.   
Бидэнд дараах суурь

class Person<T>
{
    public T Id { get;}
    public Person(T id)
    {
        Id = id;
    }
}

Person класс байлаа гэе.

  Нээгдсэн тоо: 1337 Төлбөртэй

Бид өмнөх хичээлээр C# хэлний generalization буюу ерөнхийлөл гэдэг төрөл бүрийн обьектуудын төлөв байдлын хэвийг тодорхойлох механизмын талаар үзсэн. Энэ удаагийн хичээлээр сэдвийг үргэлжлүүлэн авч үзэцгээе. Ерөнхийлөлд тодорхой хязгаарлалтууд үйлчилдэг.

Ерөнхийлөлийн хязгаарлалт  

Ерөнхийлөлд тавигдах хязгаарлалтууд түүнтэй ажиллах ажиллагааг илүү уян хатан болгодог нь сонирхолтой.

  Нээгдсэн тоо: 1965 Төлбөртэй

Манай энэ удаагийн хичээлийн сэдэв бол олонлог. C# -д олонлогийн хэдэн төрлүүд байдаг. Олонлогийн тухай ойлголт интерфейс ба ерөнхийлөлтэй их холбоотой тул хичээлийг үзэхээс өмнө интерфейс , ерөнхийлөл сэдвийн хичээлүүдийг судлахыг зөвлөе.

Олонлог гэж юу вэ?

C# -д олонлогийг ямар нэгэн обьектуудын багц гэж ойлгоно. Жишээ нь бүхэл тоонуудын массив int[] a; бол бүхэл тоонуудыг багц учраас олонлог. list<string> lst; - мөрүүдийн жагсаалт бас л олонлог. Энд ухагдхууны хувьд тодорхой төөрөгдөл үүсдэг. Ном, интернет нийтлэлүүдэд цуглуулга /collection/, жагсаалтын талаар авч үзэхдээ тэдгээрийг олонлог гэж үзсэн байдаг. Үнэн хэрэгтээ цуглуулга /collection/, жагсаалт, дарааллууд бол олонлогийн тухайн тохиолдол юм. Эдгээрийн ялгааг бид хичээлээр үзэх болно.

  Нээгдсэн тоо: 1698 Төлбөртэй

Олон урсгал ямар хэрэгтэй вэ? хичээлд програмчлалын C# хэл дээрх програмд Multithreading буюу олон урсгалыг үүсгэн удирдах шаардлага хэрхэн үүсдэг тохиолдолыг дэлгэрэнгүй үзсэн. Олон урсгалыг үүсгэн удирдах ажиллагааг программд яаж хэрэгжүүлэхийг судлахын өмнө урсгал буюу thread -ийг үүсгэх ажиллагааг дараах схемээс харцгаая. Урсгал буюу thread -ийг үүсгэхдээ Thread классыг ашигладаг. Классын байгуулагч арга шинээр үүсэх урсгал эхлэхэд ажиллах аргыг заах делегат төрлийн нэг параметрийг авдаг.

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 67

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 95

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 101

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 124

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 125

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 179

 

Хуваах нь нэг тоо нөгөө тоонд хэдэн удаа агуулагдаж буй тодорхойлох арифметикийн үйлдэл.
Хуваалтыг нэг бус удаа…

Нээгдсэн тоо : 120

 

Зуучлагч (Mediator) нь олон тооны обьектууд бие биетэйгээ холбоос үүсгэхгүйгээр харилцан ажиллах боломжийг хангах загварчлалын хэв юм. Ингэснээр…

Нээгдсэн тоо : 116

 

Делегатууд хичээлд ухагдхууны талаар дэлгэрэнгүй үзсэн ч жишээнүүд делегатийн хүчийг бүрэн харуулж чадахааргүй байсан.…

Нээгдсэн тоо : 128

 
Энэ долоо хоногт

Арифметик прогрессын ялгавар тэгтэй тэнцүү биш. Энэхүү прогрессын 1-р гишүүнийг 2-р гишүүнээр, 2-р гишүүнийг 3-р гишүүнээр, 3-р гишүүнийг 1-р гишүүнээр үржүүлэхэд гарах тоонууд өгөгдсөн дарааллаар геометрийн прогресс үүсгэдэг бол геометр прогессын хуваарийг ол.

Нээгдсэн тоо : 1334

 

Бөмбөрцөгт багтсан зөв дөрвөн өнцөгт пирамидийн суурь нь бөмбөрцөгийн төвийг дайрч байв. Пирамидийн эзэлхүүн 18-тай тэнцүү бол бөмбөрцөгийн радиусийг ол.

Нээгдсэн тоо : 1466

 

Зөв зургаан өнцөгт пирамидийн апофем h -тэй тэнцүү бөгөөд сууртай үүсгэх хоёр талст өнцөг 600 градус бол пирамидийн бүтэн гадаргуун талбайг ол.

Нээгдсэн тоо : 40