Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_theory_Ris_1g__Zachita.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
666.83 Кб
Скачать

13. Жалпыланған кластар құралдары. Жалпыланған интерфейстер.

Жалпыланған кластар құралдары

Жалпыланған кластарды құру барысында C#-тың қосысша кілттік сөздері қажет болуы мүмкін. Мысалы, жалпыланған типке null мәнін меншіктеу мүмкін емес. Бұл жағдайда default кілттік сөзін қолдануған болады. Егер жалпыланған тип Object класының құралдарын қажет етпесе, бірақ кейбір спецификациялық әдістерді шақыру керек болса, шектеулерді анықтауға болады.

Құжаттар диспетчері оқу және жазу үшін қолданылады. Жаңа DocumentManager консольін құрамыз және DocumentManager<T> класын қосамыз.

using System;

using System.Collections.Generic;

namespace Wrox.ProCSharp.Generics

{ public class DocumentManager<T>

{ private readonly Queue<T> documentQueue=new Queue<T>();

public void AddDocument (T doc)

{ look (this)

{ documentQueue.Enqueue(doc); }

}

public bool IsDocumentAvaiable

{ get {return documentQueue.Count>0; }

}

}

}

Үндеместік бойынша мәндер

Енді DocumentManager<T> класына GetDocument() әдісін қосу керек. Бұл әдістің ішінде Т типі null-ге меншіктену керек. Бірақ жалпыланған типке null-ді меншіктеуге болмайды. Өйткені, жалпыланған тип экземплярды мәннің типі ретінде құруға мүмкіндік береді, ал null тек сілтемелі типтерге ғана жіберіледі. Кілттік сөз арқылы сілтемелі типтерге null мәні меншіктеледі, ал мәндер типіне – 0.

public T GetDocument()

{ T doc=default(T);

lock (this)

{ doc=documentQueue.Decueue();}

return doc;}

Шектеулер

Егер жалпыланған класқа жалпыланған типтен кейбір әдістерді шақыру керек болса, онда шектеулер қосу керек. DocumentManager<T> жағдайында барлық құжаттардың тақырыптары DisplayAllDocuments() әдісінде көріну керек. Document класы Title және Content құрамдарымен Idocument интерфейсін жүзеге асырады.

public interface Idocument

{ string Title {get; set;}

string Content{get; set;}

}

public class Document: Idocument{

public Document()

{

}

public Document (string title, string content)

{ this.title=title;

this.content=content; }

public string Title{get;set;}

public string Content{get; set;}

}

Жалпылаулар қолдайтын шектеулер

Шектеу

Сипатталуы

Where T: struct

Т типі мәндер типі болуы керек

Where T: class

Т типі сілтемелі болуы керек

Where T: IFoo

Т типі Ifoo интерфейсін жүзеге асыруы керек

Where T: Foo

Т типі Foo-ден мұралануы керек

Where T: new ()

Ттипі үндеместік бойынша конструкторы болуы керек деп көрсететін конструктор шектеуі

Where T: T2

Т1 типі жалпыланған Т2 типінен мұраланатынын көрсету

Мұралану

Жалпыланған тип жалпыланған интерфейсті жүзеге асыра алады. Жалпыланған класс жалпыланған негізгі кластан мұралануы мүмкін:

public class Base<T>

{

}

public class Derived<T>: Base <T>

{

}

Статикалық мүшелер

Жалпыланған кластардың статикалық мүшелері тек бір класс экземплярымен бөлінеді. мысалы, StaticDemo<T> статикалық х аймағын қамтиды:

public class StaticDemo<T>

{ public static int x; }

Екі статикалық аймақ жиынтығы болады:

StaticDemo<string>.x=4;

StaticDemo<int>.x=5;

Console.WriteLine(StaticDemo<string>.x); // 4-ті жазады

Жалпыланған интерфейстер

Жалпылауды қолдана отырып, әдістерді жалпыланған параметрлермен жариялайтын интерфейстерді анықтауға болады. .NET-те әр түрлі көріністерге көптеген жалпыланған интерфейстер ұсынылады. Мысалы, Icomparable<T>, Icollection<T> және IExtensibleObject<T>. Icomparable<in T> интерфейсі жалпыланған типте құрылған:

public interface Icomparable<in T>

{ int CompareTo (T other); }

Жалпыланбаған ескі Icompareable интерфейсі CompareTo() әдісінде обьектіні талап етеді. LastName қасиеттерін қолдану:

public class Person: Icomparable

{ public int CompareTo(object obj)

{ Person other=obj as Person;

return this. lastname.CompareTo(other.LastName); }

// …

Коварианттылық және контраварианттылық

.NET 4 версиясы шыққанға дейін жалпыланған интерфейстер инвариантты болды. .NET 4-те жалпыланған интерфейстерге және жалпыланған делегаттардың кеңеюінде – коварианттылық және контраварианттылық пайда бодлы. Бұл түсініктер аргумент типтерінің құрылуына және қайтарылатын типтерге қатысты.

.NET-те параметрлер типтері коварианттылы.

Жалпыланған интерфейстердің коварианттылығы

Жалпыланған интерфейс ковариантты, егер жалпыланған тип out кілттік сөзімен болса. Бұл, Т типі қайтарылу ретінде ғана рұқсат етілгендігін білдіреді.Iindex интерфейс Т типімен коварианттылы.

pubic interface Iindex<out T>

{ T this [int index] {get;}

int Count {get;}

}

Жалпыланған интерфейстердің контраварианттылығы

Жалпыланған интерфейс контраварианттылы, егер жалпыланған тип in сөзімен болса. Осылай интерфейс Т жалпыланған типін өз әдістеріне кіріс ретінде тағайындай алады:

public interface Idisplay<in T>

{ void Show (T item); }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]