MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Moștenirea tipurilor generice

Un tip generic poate fi moștenit de la alt tip generic. Există mai multe moduri de a realiza această moștenire.

Să presupunem că avem următoarea clasă de bază Person:

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

Primul mod: Crearea unei clase derivate, tipizată cu același tip ca și clasa de bază

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

Aplicarea clasei:

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);

Al doilea mod: Crearea unei clase derivate ne-generice

În acest caz, la moștenire trebuie să specificăm tipul folosit în clasa de bază:

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

Aplicarea clasei:

StringPerson person4 = new StringPerson("438767");
Person<string> person5 = new StringPerson("43875");
// așa nu se poate scrie
//Person<int> person6 = new StringPerson("45545");

Console.WriteLine(person4.Id);
Console.WriteLine(person5.Id);

Al treilea mod: Tipizarea clasei derivate cu un alt tip

În acest caz, pentru clasa de bază trebuie să specificăm tipul utilizat:

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

Aplicarea clasei:

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

Console.WriteLine(person7.Id);
Console.WriteLine(person8.Id);

La fel putem combina parametruluniversal din clasa de bază cu parametrii proprii:

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

În acest caz, se adaugă un nou parametru K pe lângă parametrul T moștenit din clasa de bază. Dacă este necesar, se pot adăuga restricții după denumirea clasei de bază. Aplicarea clasei:

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);

Dacă în clasa de bază este stabilită o restricție pentru parametrul universal, aceeași restricție trebuie specificată și în clasele derivate care folosesc acest parametru:

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) { }
}

Dacă în clasa de bază restricția este class, adică orice clasă, atunci în clasa derivată trebuie specificată aceeași restricție sau un anumit tip de clasă.

← Lecția anterioară Lecția următoare →