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

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

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 эсхүл ямар нэгэн тодорхой классийг заах хэрэгтэй.

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

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

Удамшилт (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 классийн хийдэг үйлдлүүдийг хийх болно.

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

Бид өмнөх хичээлээр битүүмжлэгдсэн, статик классуудын талаар үзсэн. ОХП-д классууд чухал үүрэгтэй нь ойлгомжтой. Иймээс класуудын төрлүүдийг мэдээд зогсохгүй тэдгээрийг хаана хэрхэн ашиглахыг маш зөв ойлговол таны код цэгцтэй, ойлгомжтой, өөрчлөлт, шинэчлэл хийхэд уян хатан болдог. 

Програмчлалын аргачлал Singleton

Статик арга, классыг хэрхэн ашиглах жишээ болгоод Singleton гэдэг өргөн дэлгэрсэн програмчлалын  аргачлалыг авч үзье. Програм зохиогчдын дунд энэхүү аргачлалын талаар эерэг, сөрөг янз бүрийн үзэл бодлууд байдаг гэдгийг хэлэх нь зүйтэй.

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

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

Хэвийг хаана ашиглах  

  • Шинэ обьект үүсгэх ажиллагаа тухайн обьект хичнээн хэсгээс бүрддэг, эдгээр хэсгүүд өөр хоорондоо ямар холбоотойгоос хамааралгүй явагдах хэрэгтэй үед
  • Обьектыг үүсгэх явцдаа түүний төрөл бүрийн хувилбаруудыг авахыг хангах шаардлагатай үед

Хэвийг UML дээр доорх байдлаар тодорхойлж болно.

patt_12_01

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

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

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

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

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

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

 

Нэг оронтой тоонуудын хасах үйлдлийг нэмэх хүснэгтийг ашиглан хийж болно. Харин олон оронтой тоонуудын…

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

 

Геометрийн бодлогод хамгийн ихээр тохиолддог, олон төрлийн бодлогод шинж чанаруудыг ихээр ашигладаг дүрс бол тэгш өнцөгт гурвалжин.

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

 

Хичээлээр хэрэглэгч сорилгын асуултын хариугаар сонгосон хувилбарын шалгалтын логикийн боловсруулалтыг хийе. Шалгалтыг Quiz компонентийн onAnswerClickHandler аргад

  const…

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

 

Стратег (Strategy) нь тус тусдаа хайрцаглагдан тэдгээрийн бие биеэ орлолтыг хангасан алгоритмын багцыг тодорхойлох загварчлалын хэвийг илэрхийлнэ. Нөхцөл…

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

 

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

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

 

Тооны хуваагдах шинж гэдэг нь хуваах үйлдлийг хийхгүйгээр тоо хуваагчид үлдэгдэлгүй хуваагдах эсэхийг тогтоох аргачлал буюу тооны өөрийн…

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

 

Өмнөх Хулганы товч даралтын боловсруулалт хичээлд асуулт, түүний хариултуудын хувилбарууд, зөв хариултын…

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

 

Нийлбэрт нэмэх үйлдлийн үр дүн мэдэгдэхгүй байхад нийлбэрийг хэрхэн олох аргыг судлан сураад байгаа. Тэгвэл нийлбэрийн нэг бүрдүүлэгч…

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

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

Нэгээс мянга хүртэлх тоонуудаас таамгаар нэгийг авахад тэр нь 11-д хуваагдах тоо байх магадлалыг ол.

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

 

Зурагт y=f(x) функцийн график ба түүнийг x0 абциссттай цэгт шүргэсэн шүргэгчийг үзүүлжээ. y=f(x) функцийн x0 цэг дээрх уламжлалын утгыг ол.

Тайлбар: Уламжлал, түүний геометр утгыг ойлгоход маш хэрэгтэй бодлого. Манай ЭЕШ -д ийм төрлийн бодлого бараг харагддаггүй ч орж ирэх өндөр магадлалтай.

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

 

утгыг ол.

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