Нэг ерөнхийлөлтэй класс өөр ерөнхийлөлтэй классаас удамшиж болно. Ингэхдээ удамшилтын төрөл бүрийн хувилбаруудыг ашиглах боломжтой.
Бидэнд дараах суурь
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 эсхүл ямар нэгэн тодорхой классийг заах хэрэгтэй.