Ерөнхийлөгдсөн төрлүүдийн удамшилт

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

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

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

Нэгдүгээр арга нь суурь классийн төрлөөр төрөлжсөн удамшсан классийг үүсгэх.

class UniversalPerson<T> : Person<T>
{
    public UniversalPerson(T id) : base(id) { }
}

Классийг хэрэглэх

Person<string> person1 = new Person<string>("34");
Person<int> person3 = new UniversalPerson<int>(45);
UniversalPerson<int> person2 = new UniversalPerson<int>(33);
Console.WriteLine(person1.Id);
Console.WriteLine(person2.Id);
Console.WriteLine(person3.Id);

Хоёрдугаар арга бол ердийн ерөнхийлөлгүй удамшсан классийг үүсгэх юм. Ингэж удамшуулахдаа суурь класст хэрэглэх төрлийг шууд заах хэрэгтэй. Жишээ нь

class StringPerson : Person<string>
{
    public StringPerson(string id) : base(id) { }
}

Ингэснээр үүсмэл классийн төрлөөр string төрлийг ашиглах болсон.

Классийн ашиглалт

StringPerson person4 = new StringPerson("438767");
Person<string> person5 = new StringPerson("43875");
// Person<int> person6 = new StringPerson("45545");  // гэж бичиж болохгүй
Console.WriteLine(person4.Id);
Console.WriteLine(person5.Id);

Гуравдахь хувилбар бол үүсмэл классийг суурь классийн универсал параметрээс бүр өөр төрлийн параметрээр төрөлжүүлэх юм. Энэ тохиолдолд суурь класст хэрэглэгдэх төрлийг бас заан өгөх хэрэгтэй. Жишээ нь

class IntPerson<T> : Person<int>
{
    public T Code { get; set; }
    public IntPerson(int id, T code) : base(id)
    {
        Code = code;
    }
}

Одоо IntPerson төрөл суурь класст хэрэглэж буй төрөлтэй тохирохгүй бас нэгэн төрлөөр төрөлжих боломжтой болсон.

Классийг ашиглах.

IntPerson<string> person7 = new IntPerson<string>(5, "r4556");
Person<int> person8 = new IntPerson<long>(7, 4587);
Console.WriteLine(person7.Id);
Console.WriteLine(person8.Id);

Үүнээс гадна удамшсан класст суурь классийн универсал параметрийг өөрийн параметрүүдтэй хослуулан ашиглаж болно. Жишээ нь

class MixedPerson<T, K> : Person<T>
    where K : struct
{
    public K Code { get; set; }
    public MixedPerson(T id, K code) : base(id)
    {
        Code = code;
    }
}

Дээрх кодод суурь классийн T параметрт нэмэлтээр K шинэ параметрийг оруулсан. Удамшуулахдаа хязгаарлалтыг заан өгөх хэрэгтэй болбол суурь классийн нэрийн араас түүнийг зааж болно.

Классийг хэрэглэх.

MixedPerson<string, int> person9 = new MixedPerson<string, int>("456", 356);
Person<string> person10 = new MixedPerson<string, int>("9867", 35678);
Console.WriteLine(person9.Id);
Console.WriteLine(person10.Id);

Хэрвээ суурь классийн түвшинд универсал параметрт хязгаарлалт тавигдсан бол параметрийг ашиглах үүсмэл класст тухайн хязгаарлалтыг тодорхойлсон байх ёстойг сануулъя.

class Person<T> where T : class
{
    public T Id { get;}
    public Person(T id) => Id = id;
}
class UniversalPerson<T> : Person<T> where T: class
{
    public UniversalPerson(T id) : base(id) { }
}

Өөрөөр хэлбэл суурь класст class буюу дурын класс гэсэн хязгаарлалтыг заасан бол үүсмэл класст хязгаарлалтаар class эсхүл ямар нэгэн тодорхой классийг заах хэрэгтэй.

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

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

Өмнөх хичээлд бид өгөгдлийн сантай ажиллах Entity Framework технологи гэж юу болох, өгөгдлийн сантай ажиллахад шаардлагатай хэрэгслүүд, тэдгээрийг хэрхэн суулгахыг үзээд өгөгдлийн сан үүсгэн түүнд хандах жижигхэн програмыг зохиосон. Энэ хичээлээр өмнөх хичээлд бичсэн програмын код хэрхэн ажиллаж байгааг үргэлжлүүлэн судлах болно. Програмын кодыг сануулбал

using DbDemo.Properties;
using System;
using System.Data;
using System.Data.SqlClient;

namespace DbDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (IDbConnection connection = new SqlConnection(Settings.Default.DbConnect))
            {
                IDbCommand command = new SqlCommand("SELECT * FROM t_customers");
                command.Connection = connection;
                connection.Open();
                IDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("Id: {0}\t Нэр: {1}", reader.GetInt32(0),
                        reader.GetString(1));
                }
            }
            Console.ReadLine();
        }
    }
}

гэж байгаа.

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

Өмнөх хичээлүүдэд int, byte, double, string, object гэх мэтийн өгөгдлийн төрлүүдийг үзсэн. Үүний зэрэгцээ структур, тооллого /enum/, класс зэрэг нарийн төрлүүдийг ч үзсэн. Энэ бүх төрлүүдийг утгын төрлүүд (утгатай төрлүүд ч гэж бас нэрлэдэг) (value types) ба холбоосын төрлүүд (reference types) гэсэн ангилалд хувааж болно. Эдгээрийн ялгааг ойлгох нь чухал.

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

Удамшилт (inheritance) бол ОХП -ийн үндсэн ойлголтуудын нэг. Удамшилтаар нэг класс өөр классийн ажиллагаануудыг өвлөх /дамжуулан авах/ боломж бүрддэг. Бидэнд хүнийг тодорхойлох

class Person
{
    private string _name = "";
 
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    public void Print()
    {
        Console.WriteLine(Name);
    }
}

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

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

Програмд өгөгдөл хадгалахдаа хувьсагчийг ашигладаг. Хувьсагч нь тодорхой төрлийн утгыг хадгалж буй санах ойн нэрлэгдсэн хэсэг юм. Хувьсагч төрөл, нэр, утгатай байна. Хувьсагчид ямар төрлийн өгөгдөл хадгалахыг төрөл тодорхойлдог. Ямарч хувьсагчийг ашиглахын өмнө тодорхойлох хэрэгтэй. Хувьсагч тодорхойлох /зарлах/ бичлэгийн дүрэм

төрөл хувьсагчийн_нэр;

байна. Эхлээд хувьсагчийн төрөл дараа нь түүний нэр. Дараах шаардлагыг хангасан дурын нэрээр хувьсагчийг нэрлэж болно.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

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

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

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

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

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

функцийн интервал дахь хамгийн бага утгыг ол.

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

 

Зөв дөрвөн өнцөгт пирамидын өндөр 4. Хажуу ирмэг суурийн хавтгайд 30 градусын өнцгөөр налсан бол пирамидын хажуу ирмэгийг ол.

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

 

бол M·N=?

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