C# Тілінің негіздері



Кіріспе 4
1 C# Тілінің негіздері 5
2 C# тілінде объектілі.бағытталған бағдарламалау 8
3 Абстрактілі класстар 11
4 Интерфейстің қолданылумен программалау 14
4.1 Интерфейске сілтеме алу 15
4.2 Интерфейстер мен мұрагерлер 16
5 Реттелген мәндер және мәтінмен жұмыс 19
5.1 Реттелген мәндер 22
6 С# тіліндегі қосымша құралдар. 24
7 Өкілдер және оқиғалар. 27
8 Web . қосымша және ASP.NET құру. 31
Қорытынды 35
Пайдаланылған әдебиеттер тізімі
Microsoft Visual Studio — Майкрософт компаниясының өнімдер тізбегі, құрамына біріктірілген өңдеу ортасы бағдарламалық жасақтамасы және басқа да аспаптық (инструменталды) құралдар кіреді. Аталған өнімдер консольдік қосымшалармен қатар қолданбалы бағдарламалық жасақтамалары да кіреді, мысалы қолданушының графикалық интерфейсі жасақтамасы, сонымен қатар Windows Forms технологиясын қолдану арқылы да, жәневеб-сайт, веб-жасақтамалар, веб-қызметтер Машинелік кодында және басқа Басқарылатын код арқылы даMicrosoft Windows, Windows Mobile, Windows CE, .NET Framework, .NET Compact Framework и Microsoft Silverlightқолданатын барлық платформаларға.
1.Самоучитель Microsoft Visual Studio C++ и MFC. Сидорина Т.Л стр 101

2. MS Visual C++ 2010 в среде .NET Зиборов В.В.стр 95-97

3. Мак-Дональд М. WPF Windows resentation foundation в .NET 3.5 с примерами на C# 2008. 2008, 924 стр.

4. Иванов И.И, Проектирование самолетов: учебник для вузов, Высшее образование, 2010, Высшая школа, PDF, OCR, 750 стр.

МАЗМҰНЫ

Кіріспе 4
1 C# Тілінің негіздері 5
2 C# тілінде объектілі-бағытталған бағдарламалау 8
3 Абстрактілі класстар 11
4 Интерфейстің қолданылумен программалау 14
4.1 Интерфейске сілтеме алу 15
4.2 Интерфейстер мен мұрагерлер 16
5 Реттелген мәндер және мәтінмен жұмыс 19
5.1 Реттелген мәндер 22
6 С# тіліндегі қосымша құралдар. 24
7 Өкілдер және оқиғалар. 27
8 Web – қосымша және ASP.NET құру. 31
Қорытынды 35

Пайдаланылған әдебиеттер тізімі
36

КІРІСПЕ

Microsoft Visual Studio — Майкрософт компаниясының өнімдер тізбегі,
құрамына біріктірілген өңдеу ортасы бағдарламалық жасақтамасы және басқа да
аспаптық (инструменталды) құралдар кіреді. Аталған өнімдер консольдік
қосымшалармен қатар қолданбалы бағдарламалық жасақтамалары да кіреді,
мысалы қолданушының графикалық интерфейсі жасақтамасы, сонымен
қатар Windows Forms технологиясын қолдану арқылы да, жәневеб-сайт, веб-
жасақтамалар, веб-қызметтер Машинел ік кодында және басқа Басқарылатын код
арқылы даMicrosoft Windows, Windows Mobile, Windows CE, .NET
Framework, .NET Compact Framework и Microsoft Silverlightқолданатын барлық
платформаларға.

1 C# Тілінің негіздері

Орнатылған дерек түрлері, шартты өтулер мен циклдар құрылымы, ораушы
және ашу механизмдері, сонымен қатар, символдық мәндері, массивтер,
тізімдер және ашу механизмдері, сонымен қатар, символдық мәндері,
массивтер, тізімдері және құрылымдары бар бағдарламалаудың нысанды-
бағытталған тілі ретіндегі C#-ның негізгі аспектілерімен таныстыру болып
табылады.
Біз C# базалық кластар кітапханасына жүгініп, атаулардың әртүрлі
жүйелік кеңістігін қолданамыз. Барлық бағдарламалау логикасы пайдаланушының
түрлік анықтамасында болуы керек. С#-де ауқымды функциясын және ауқымды
айнымалыларын қолдануға болмайды. С#-де қарапайым класы келесі түрде
анықталуы мүмкін:
using System;
class Hello
{
public static void Main(string[] args)
{Console.WriteLine(“Hello, Student”);
}
}

C# тілінде кез келген қосымшасында Main() әдісімен класс анықталуы
керек. Main әдісі қосымшасына қосу кезінде команда жолдарының параметрлерін
қабылдау үшін қолданатын символдар жинағы сияқты жалғыз параметрін
қабылдайды.
C# тілінде жаңа объектіні құру үшін new сөзін қолдану керек:
using System;
class Hello
{public static void Main(string[] args)
{Hello obj = new Hello();
}
}

Obj объектісі кез келген класқа C# компиляторымен автоматты түрде
жабдықталған және мәндер күйінің деректерін қабылдайтын(көп жағдайда көп
мәнін) үнсіздік бойынша конструкторы арқылы құрылыды.
C# тілінде объектілерді жою және жадтың босауы туралы ойланудың қажеті
жоқ, .NET жадты автоматты түрде босатады.
Нақты қосымшаларды құру кезінде “қызығушылықтың бөлінуі” шығатын жолды
пайдаланған дұрыс, яғни Hello класын Hello Class және Hello Apl сияқты екі
бөлек кластарға бөлу қажет.
Hello Class – әр түрлі операцияларын орындау логикасы жинақтплған
класс, ал Hello Apl. –осы қосымша үшін кіру нүктесі қамтамасыз ететін
класс. Әрбір класқа *.sc жеке файлы қолданылады.
C#-де құрылымдық және сілтеме түрлеріне бөлінетін деректердің типтері
енгізілген жиыны бар. Құрылымдық түрлеріне барлық сан деректер түрі,
сонымен қатар тізімдер мен құрылымдар жатады. Сілтеме түрлері – кластар
және интерфейстер. Құрылымдық түрлерді көшіру барысында бит көшірмесі
тағайындалады, ал сілтеме көшірмесін жасауда сол жады аймағын көрсететін
тағы да бір сілтеме құрылады.
Барлық айырмашылықтарына қарамастан құрылымдық және сілтеме түрлері
үйреншікті(енгізілген) және қосымшалы интерфейстерін іске асыра алады жіне
өрістер, әдістер, қасиеттер және оқиғалар кез келген санын қолдай алады.
Осы түрлердің арасындағыайырмашылығын көрсететін кодты қарастырайық:

struct PERSON құрылымдық тип
{public string Name;
public int Age;
};
class Person
{public string Name;
public int Age;
};
class ValRefClass
{public static void Main()
{Person obj 1 = new Person(); obj 1 – объектіге сілтеме
PERSON r1 = new PERSON(); r1 – стектегі мәні
PERSON r2 = r1; r2 көшірмесі r1 стектегі
Person obj2 = obj 1; obj2 – тағы бір сілтеме
}
}
Мұндағы r1, r2 – мәндері құрылымдар болатын стек айнымалылары, ал
obj1, obj2 – динамикалық жадтағы объектілеріне сілтеме.
Кез келген C# деректер түрі – бұл System атаулар кеңістігінде
анықталған типі үшін бүркештік атауы. Мысалы, int типі – Int32 жүйелік
түрдің оңай және ыңғайлы түрі, сондықтан келесі синтаксистік болуы әбден
мүмкін:

Console.WriteLine(25. ToString());

Жүйелік түрлер иерархиясы келесі түрде көрсетіледі:
Object – аналық класс: Type, String, Array, Exception,
Delegate – аналық класс MultiCastDelegate.
ValueType – аналық: Enum, Boolen, Byte, Char, Decimal, Double, Int16,
Int32, Int64, Sbyte, Uint16, Void, Guid, DateTime, TimeSpan, Single.
Кейбәр жүйелік түрлер ерекше түсіндірулерді талап етеді. C++ тілінен
айырмашылығы, System.Boolean айнымалы түріне тек қана true немесе false
тағайындауға болады. C# тілінде мәтіндік деректер үшін тек қана екі түрі
қолданылады: string және char.
C# - де құрылымдық түрін сілтемеге түрлендіруі үшін қарапайым
механизмі қарастырылған. Оны ораушы деп атайды. Осылайша, келесі әрекеттер
жүзеге асады: үймеде жаңа нысан құрылады және оған стектен ескі объекттің
ішкі деректері көшіріледі.
short r = 25; object obj = r;
Сілтеменің қайтадан құрылымдық түріне түрлендіруі – нысанды кері ашу
болып табылады.
short n = (short) obj;
Ораушы және ашу операциялары компилятормен автоматты түрде орындалады.
Мысалы, құрылымдық түрін параметр ретінде қабылдайтын әдісіне жіберу
кезінде.
Барлық айнымалыларға класс жасау кезінде мүшелерге автоматты түрде
үнсісдік бойынша қауіпсіз мәндер тағайындайды, әдістер ішіндегі айнымалылар
үшін, extern айнымалыларынан басқа орындалмайды.
C# тілінде foreachin деген жаңа өрнегі бар. Foreach конструкциясы
қарапайым массивтердің барлық элементтерін тізбекті түрде өңдеуге және
коллекйияларымен жұмыс істеуге мүмкіндік береді.
C#-де кез келген әдіс міндетті түрде класс немесе құрылымның мүшесі
болуы керек. Әдістер параметрлерді қабылдауы немесе қабылдамауы мүмкін,
мәндерді(пайдаланушы немесе енгізілген деректер типі) қайтаруы немесе
қайтармауы мүмкін және статистикалық немесе даналар әдістері болуы мүмкін.
Көп жағдайда, C# құрылымдарын класстардың ерекше бір түрі ретінде
қарастыруға болады. Құрылымдарды класстармен көп нәрсе жақындастырады:
құрылымдар үшін конструкторларды(параметрлермен) анықтауға болады,
парамтрлерді қабылдайтын және қайтарылатын әдістер ретінде пайдалануға
болады. Жанама барлық құрылымдар ValueType түрінің туындылары болып
табылады.
Нақты бағдарламаларды құрастыру кезінде атаулар кеңістігінде деректер
типін топтастыру өте пайдалы. C# -де бұл операциясы namespace сөзі арқылы
орындалады. Біртұтас атаулар кеңістігін бірнеше файлдарға бөлуге болады, ол
үшін әр түрлі файлдарда бір атаулар кеңістігін анықтап және оған класстар
анықтауларын орналастыруы жеткілікті. Бұл жағдайда атаулар кеңістігі барлық
типтер үшін контейнер сияқты жұмыс істейді.

2 C# тілінде объектілі-бағытталған бағдарламалау

Қарапайым кластың анықтамасында берілген класс нақты объект ішкі күйін
көрсетеді, ал әдістер объектінің күйімен өзара әрекеттесуге арналған
құралдармен қамтамасыз етеді.
C#-тың кез келген класы үнсіздік бойынша конструкторымен қамтамасыз
етеді. Егер сіз біреу болсада пайдаланушы конструкторды анықтасаңыз, онда
үнсіздік бойынша автоматты түрде конструктор құрастырылмайды және оны
тікелей анықтауға тура келеді.С++ тіліндегі сияқты, С#-та this сөзі
объектінің ағымдағы данасына сілтеме үшін қолданылады.
С#-та класс үшін үнсіздік бойынша ашық интерфейс бұл кластың келесі
мүшелерінен тұра алады: әдістер, қасиеттер және өрістер. Сонымен бірге
үнсіздік бойынша класстардың ашық интерфейсі оқиғаларды қолдау үшін
бапталған.
Класс (тип) деңгейінде көру кеңістігінің нұсқауы объектілердің
даналары (экземпляр) арқылы кластар өрісіне қатынау орындалғанда, кластар
мүшелері үшін көру кеңістігінен басқа, кластармен қатынасуына мүмкіндігі
барбағдарламаның аймағы анықтайды.
Кластар – бұл көру кеңістігінің атрибуты бар болатын жалғыз емес
пайдаланушы деректер типі. Тип – бұл кластар, құрылымдар, тізімдер,
интерфейстер және делегаттардың қатынасында қолданылатын жалпы термин. С#-
та барлық дерек типтері өзінің құрастыру шегі үшін жетімді болып жариялай
алады, жабдықтар – осы құрастыру үшін ғана жетімді болады.
С++ тілінде сияқты, С#-та ОББ негізгі қағидалары іске асырылған:
инкапсуляция – объектілер сияқты өзінің ішкі құрылымдарын жасырады;
мұрагер – кодты қайтадан қолдану; полиморфизм – берілген объект типіне
байланысты қажетті іс – әрекетті орындауды қолдану.
Кодты қайтадан қолдануының екі формасы бар: “болу” (is-a) классикалық
мұрагерлік және “бар болу” (has-a) – бір класс өз құрамын басқа класты
қосатын және осы ішкі класс мүмкіндіктерінің бөлігін сыртқы әлемге ашып
беру.
Полиморфизмнің екі негізгі түрі бар: классикалық туындылар класында
негізгі класс мүшелерінің орнын басу және ( ad hoc polymorphism )
мұрагерімен байланысты емес объектілеріне ұқсас түріне айналуға мүмкіндік
беретін полиморфизм. Бұған әсер ету өте оңай: мұндай объектілердің
әрбірінде бірдей сигнатурасы бар әдіс болу керек.Типке байланысты қажетті
әдіс шақырылады.
Сонымен бірге кластың жабық мүшелеріне қатынасу үшін өзгерістің және
қатынаудың дәстүрлі әдістерінен басқа қасиеттерді (properties) қолдануға
болады. Қасиеттер кластың ішкі деректеріне қатынауды дәл келтіруге
мүмкіндік береді: қасиет арқылы алу немесе өзгеріс енгізу кезіндегі
синтаксис кәдімгі ашық айнымалыға қатынасу кезіндегідей көрінеді. Қасиеттер
әрқашан қатынау және өзгерістер әдістерінде көрсетіледі, ал бұл әдістердің
анықтауында кез келген логиканы жүзеге асыруға болады. С#-та қасиет екі
блоктан тұрады – қатынау және өзгеріс блогы. Value қасиет арқылы мәндерді
берген өрнегінің бірінші бөлігін көрсетеді ( Value – сөзімен көрсетілсе, ол
да объект болып табылады ).
Мұрагер болудың екінші бір түрі қосындысының үлгісі болып табылады.
Бұл жағдайда қабаттасқан түрлер үшін көру аймағын бақылауынан басқа, ішкі
түрлердің функцияналдығымен сәйкес келетін функцияналдығы және сыртқы
әлемнен тікелей қатынау мүмкін емес қабаттасқан типтердің (nested types)
анықтамасы туралы айтылады. Класс – кез келген қабаттасқан түрлердің
объектерін құруға мүмкіндігі бар контейнері.
С#-та қабаттасқан кластар private және public болып белгіленеді.
С#-та virtual және override сөздер келесі мәселе шешімі үшін
қолданылады; “Бір әдісті әртүрлі кластар объектілеріне әртүрлі әрекет
ету?”. Virtual сөзі туынды класта орнын басатын базалық кластың әдісін
анықтайтын, сонымен қатар бірге бұл базалық класс әдісінің шақыруы
қолданылады. Override сөзі тунды класында қайтадан виртуалды әдісін анықтау
қажет болған жағдайда қолданылды, сонымен бірге әрбір ауыстырған әдістерін
анықтауда базалық класс әдісінің шақыруы қолданылады. Сонымен, туынды
класта ауыстырған әдістің логикасын қайтадан анықтаудың қажеті жоқ: базалық
класта қажетті іс-әрекеттермен толықтырылып анықталған үнсіздік бойынша
әдісімен қолданған жеткілікті. Сонымен әртүрлі кластар объектілерінің
әртүрлі жүріс – тұрыстары іске асырлады.
Кластардың барлық объектілері үймеде жасалады, сондықтан олармен жұмыс
істеу үшін сілтемелерді қодану керек. Сілтемелер – бұл объектіге қатынауын
ұйымдастыратын және объект жадының адресін сақтауын қабілетті арнайы
айнымалылар типі.NET Framework –та жадыны басқаруына Garbage Collector (GC)
жауап береді. Сілтемелермен жұмыс істегенде келесі болмысты есте сақтау
керек: базалық класқа сілтеме туынды кластың объектісін меншіктеуге болады.
Бірақ NET Framework барлық кластар System.Object класынан туындалған. Егер
сіз базалық класты анық көрсетпесеңіз де бұл дұрыс болады. Кез келген
базалық класс object-тен ашық емес туындалған. Демек, объект сілтемесіне
кез келген кластың объектісін иемденуге болады. Бұл жалпы коллекцияларды
объектілерді сақтағанда, ортақ әдістерді құрғанда және тағы басқа ыңғайлы
болады. ArrayList, HashTable сияқты коллекциялар object-тен жұмыс істейді.
Базалық класс сілтемесімен жұмыс істегенде объект типіне және оны туынды
типіне өзгерісін тексеруі қажеттілігі пайда болады. Ол үшін С#-та as және
is операторлары бар.
Аs операторы қауіпсіз өрнектеуді орындауға мүмкіндік береді, басқа
жағдайда null – ды қайтарады. Is операторы түрлендіру мүмкіндігін
тексереді. Оның жұмысының нәтижесі Boolean типінің мәні болып табылады.
Сонымен, туынды класта public немесе protected модификаторымен жарияланған
әдістерді қолдануға болады. Туынды класта әдістердің орнын басудың екі
мүмкіндігі бар: полиморфизмнің қолдауысыз базалық кластың әдісінің орнын
толық басу және полиморфизмнің қолдаумен базалық класс әдісін артық
жүктелуі. Base базалық класында осы кластар объектілерін салыстыратын
Compare – әдісі болсын. Base туындалған ұқсас әдісі Der класы болсын. Der
класының құрылымы басқа, сондықтан Compare өз іске асыруын талап етеді.
Біздің мақсатымыз – осы объектілердің типтері үшін іріктеу әдісін жүзеге
асыру. Осы мақсатқа полиморфизм мүмкіндіктері арқасында іске асырылады.
Егер әдіс полиморфизмді қолдаса, онда базалық класқа сілтеме арқылы “дұрыс”
әдісін шығаруға мүмкіндік береді. “Дұрыс” деген ұғым объектіге қажет класс
түрінде іске асырылған әдісін білдіреді.
Әдістің жүріс-тұрысын өзгертудің екінші әдісі – оны полиморфизмнің
қолдаусыз орнвн басу.Ол үшін туынды класында new сөзі қолданылады. Ұқсас
артық жүктелуі кәдімгі және виртуалды әдістер үшін жұмыс істейді.

3. Абстрактілі класстар

Бұл дәріс "ықтиярсыз полиморфизм" ұғымымен және ол абстрактілі
әдістер мен класстар арқылы жүзеге асырылуын таныстырады. Тек бір
ғана қысқарту әдістері деңгейінде қалай мұрагер қатынасын бұзуды,
толығырақ C# -тегі келтірілген типтерді қарастырамыз, сонымен бірге
орныдау уақытының қателерімен күресу үшін және "басқарылатын үйіндінің"
жұмыс тетіктерінің құрылымдық өңдеуін қолдану туралы ұсынысты
аламыз.
Кейінірік тағы қарастырылатын интерфейстер іске асырылғандайды,
бірақ кейбір ортақтың жиі өідеулі кезінде әдістер бөләгә мен
мәліметтерді анықтауды жүзеге асыру керек болады. Осы мақсатта
келесіде мәлімет сияқты қолданылатын жай класты қолдануға болады.
Басқа жағынан туынды классындағы "бос" болып қалатын әдістердің іске
асырылуына кепілдік беруге болмайды. C#-та айтылған мәселенің
шешілуіне абстрактілі класстар бар болады. Сондықтан кәдімгі бұған
сәйкес келмейді. Бұл abstract деген кілттік сөзінің көмегімен
жарияланған арнайы класстардың түрлері. Егер класс осылай жарияланған
болса, онда оның абстрактілі екенін білдіреді және ұқсаскластың
объектісін құру мүмкін болмайды, бірақ одан мұрагерлерлік болуы әбден
мүмкін. Абстрактілі класс абстрактілі кластағы іске асырылуы болмайтын
абстрактілі әдістер бола алады, бірақ іске асыру жанама түрде болуды
талап етеді. Абстрактілі әдістер де abstract сөзі арқылы жарияланады.
Сонымен абстрактілі класстар өзінен кәдімгі негізгі кластар мен
интерфейс мүмкіндіктерін біріктіреді. Бірақ оларға мұрагер болу кезінде
кәдімгі негізгі кластар мен интерфейс мүмкіндіктерін біріктіреді.
Бірақ оларға мұрагер болу кезінде кәдімгі класстарға арналғандай C#-
тегі ереже салдарлары таралады. Бірақ бір кластан көп мұрагерлік ету
мүмкін емес.
Класта абстрактілі деп жарияланған кейін, одан кез келген
абстрактілі әдістердің санын анықтауға болады. С++ таза виртулды
функциясының аналогы: олар негізгі кластардағы әдістерді іске асырусыз
анықтауға мүмкіндік береді. Барлық виртуалдық әдістер міндетті түрде
туынды класстарда орналасуы керек. Дегенмен C#-тегі вмртуалды
әдістерді қайдағы бәр туынды класстарға орналастыруға болады. Сонымен
бірге осындай туынды класстың объектісі үшін виртуалды әдістің
шақырылуы кезінде бұл әдіс негізінде кластағы өз анықтамасына сәйкес
орындалады.
Егер бізге әрбір туынды класстардағы қандай да бір негізгі класс
әдісіне міндетті түрде орналастыруға кепілдік беру қажет болса,
онда біз бұл әдісті абстрактілі деп жариялауға міндеттіміз. Егер
туынды классты абстрактілі әдіске орналастырмасақ, онда ондай класс
абстрактілі болып есептеледі, және бұл туынды класстан объектер құруға
болмайды.
Енді соған сәйкес бұл әдісті шақырылған класс объектісі үшін
нақты іске асыру әдісін автоматты түрде таңдалатын болғандықтан C#-
тегі полиморфизмнің толық күшін қолдануға болады. Ол үшін
абстрактілі классындағы айнымалыны қолдана отырып, мысалы массивті, кез
келген туынды класс сілтемелерін сақтауға болады. Объектіде жататын
классқа сәйкес бағдарламаның орындалуы, тікелей керек нұсқа әдісі
туынды класс объектілерін массив элементтерін массив элементтерінің
сілтемелеріне жүргізу кезінде таңдалады.
С++-те әдістердің орын басуына қарсы қоюға болатын туынды
класстарда тағы бір әдістермен жұмыс жасауға болады. Бұл қабылдау
(әдіс) әдістердің жасырып қалуы деп аталады және ол негізгі және
оның туынды класстарындағы әдіс логикасының мұрагер болуына тиым
салынуынан тұрады. Бұл іс жүзінде жалғыз әдіс деңгейінде мұрагер болу
қатынасының үзілуін білдіреді. C#-та бұл жағдай үшін қолданатын
болжамдар бақылауы деп аталатын құралды ұсынады.
Оларды қолдану үшін туынды кластағы new кілттік сөзбен басталатын
әдісті табу жеткілікті, сонда негізгі класстағы бұл әдістердің кез
келген жүзеге асырулары жасырын болып қалады.
Алайда, егер негізгі кластар үшін нұсқа әдісін шақыру
қажеттілігі бар болдаы. Оны анық түрге келтіру көмегімен жасауға
қажет болған кездегі жағдайларда жиі қолданылады.
С++ бір типтің (тұрпаттың) басқа тип объектісіне өзгеруін
жүзеге асыруға мүмкіндік береді.
Түрге келтірудің бірінші заңы былай айтылады: егер бір класс
басқаларға туынды болып табылса, онда негізгі класс объектісі арқылы
әр уақытта туынды класс объектісіне сілтеу қауіпсіз болады.
Нәтижесінде біз С++-те қуатты программалық (бағдарламалық)
конструкцияларды қолдана аламыз. Мысалы, өзінің негізгі түрі және кез
келген осы негізгі түрдің туындысы сияқты әдіс объектісне жіберуге
болады. Бұл жағдайда негізгі кластан туынды класқа анықталмаған
келтіру жүргізілетін болады.
Сандық түрлердің келтіруі шамамен келтіруі шамамен келтірілген
класстардағыдай ережелермен бағынады. "Үлкен" сандық түрді "кішіге"
келтіру кезіндк анық өрнектеу жүргізу қажет. IAction cef= (IAction)
объекті.
Ерекшеліктердің өңделуі
.NET олар туралы орындау мен қателерін табуға арналған және
хабарлама жіберу үшін біртұтас техниканы ұсынады. С++-тегі ерекшелік
бұл System. Exception класста өндірілетін объект.
Әдіттегідей, ерекшелік қандай да бір әдістің орындалуы дереу
үзілуі кезінде ғана бөліп жіеру керек. Кітапханаларда . NET орындалуы
ортасы дайын ерекшеліктер жиынымен енді анықталған.
Мысалы System атындағы кеңістіктерде ArgumentOutOfRangeException,
IndexOutOfRangeException, StackOverflowException ерекшеліктері және
басқалар анықталынған. Басқа кеңістіктердегі аттар осы кеңістік аты
жауап беретін облыстарға жататын ерекшеліктерімен анықталған.
System.Exception-тан туындаған бізге қажетті мүшелердің ерекшелігі
өз жеке классымызды құруға негіз болды. Әрі қарай барлық қажетті catch
ішкі блогында қолданылатын қасиеттерді, әдістер мен өрістерді анықтауға
болады. System.Exception негізгі класында анықталған кез келген
виртуалдық мүшелерді де орналастыра аламыз. Сонымен ол туралы ерекше
анықтамалардың толық сипаттамасы мен толық мәліметтің көрсетуіне қол
жеткізуін болады. Қолданушы ерекшелігін құру негізгі қате пайда болған
кезде пайдаланушы класымен тығыз байланысты.
С++-тегі try catch блогының кейін ерекшелік жұмыс істеді немесе
жоқтығына әр уақытта тәуелсіздігі орындалатын міндетті емес finally
блогы шығады. Finally блогы нақты жобалардағы программаның түзу
аяқтауымен байланысты жадының босауы, файлдың жабуы, мәліметтер мен
көзден өшірілуі, қалған опреациялардың орындалуында қолданылады.
Ерекшеліктің жасалуы мен оның ұстап қалуы- бұл тек қана ортақ схема
(сызба), ал нақты толық толтырылатын мазмұны бағдарламашыға тәуелді болады.
Барлық әлемдегідей .NET, қоқыс жинақшысы- ол объект, біз оған
сілтеме арқылы қарай аламыз. C#-те қоқыс жинаушының жұмысы үшін
System.GC деген класы берілген. Бұл класс sealed арқылы анықталған, яғни
мұрагерлік көмегімен мүмкін емес одан басқа кластар құрады.
Әдеттегідей,программаның соңында аяқталған объектілерді белгілегендей
барлығы үшін дедукторлардың жұмыс істеуін қамтамасыз ететін
GC.Collect() әдісін шақыруға жүргізіледі.

4 Интерфейстің қолданылумен программалау

Бұл дәрісте қолданушы интерфейстердің қалай құрылатынын және жүзеге
асатынын, қалай типтер құратынын білетін боламыз. Сонымен қатар біз
интерфейстен қалай сілтеме алу керектігін және интерфейстердің жанама іске
асуын айтатын боламыз.
.NET базалық класындағы стандартты интерфейстердің және олардың
қолданушы кластарда қолданылуын қарастырамыз.
Сондағы ең маңызды роль атқаратын интерфейс тұжырым-даналары-
программалау. Интерфейс – бұл клиент СОМ көмегімен интерфейс көрсеткіші
негізінде СОМ кластарымен .NET қолдануда екі екілік файлдар арасындағы
қарым-қатынасты жүзеге асыру жалғыз шешім емес. . NET немесе
интерфейстерде бар кодтарды тәуелділіксіз бүлдіру қолданушы түрінің
функционалдығын кеңейтудің ең ыңғайлы әдісі.
Интерфейс – бұл абстрактылы мүшелермен семантикалық байланысқан жинақ,
бұл соңғы жағдайдағы абстракылы кластар. .NET интерфейстері кез келген
қасиеттер санын қолдай алады. Кез келген жағдайда интерфейс – ол
абстрактілі мүшелердің аталған жиыны, бұл демек, осы интерфейсті іске
асыратын кез келген класс, бұл интерфейс мүшелерінің әрбірі толық
анықтауғаөз алдына міндетті. Сонымен интерфейс – бұл тағы бір қосымшадағы
полиморфизмнің іске асыру әдісі: бір немесе сол интерфейстердің әр түрлі
кластардағы мүшелері әр түрлі іске асыруы мүмкін, нәтижесіндек бұл класстар
сізге мәлім интерфейсті қолдайды, онда сіздер бұл интерфейс әдістеріне
олардың тиісті түрдн сезінулерін күтуге құқылысыздар. Абстрактілі
мүшелерден тұратын кластарға қарағанда, интерфейс – бұл тек нақты мақсаттар
үшін қолданылатын таза синтаксистік құрылым (конструкция). Интерфейстер
ешқашанда мәліметтер түрі болмайды және оларды үнсіз әдістерді жүзеге асыру
болмайды. Әрбір интерфейс мүшесі автоматты түрде абстрактілі болады және
соңғы кластағы бірден бірнеше интерфейстерді жүзеге асыру – ол кәдімгі іс
болып табылады.
Егер іс әрекет жиынтығы тек қалай үшін мағына беретін болса, онда
нақты иерархия класстары осы әрекеттерді әр түрлі әдістермен жүзеге
асырады. Бұл жиын негізгі абстрактілі класс иерархиялар түріндегі
виртуалдық әдістерді қою орынды болады. Интерфейтер де әр түрлі иерархия
объектілерінің жалпы қасиеттерін беру үшін қолданылады.
С++ қандай да бір класс біз қажетті интерфейстерді іске асыру қажет
болса, ондай интерфейстердің атын осы кластардың аттарынан кейінгі қос
нүктеден кейін орналастыру қажет. Негізгі класстың аты әр түрлі уақытта кез
келген интерфейстер аттарыныңалдында тұруы қажет. Сонымен С++ те
интерфейстер үшін көпмүшелер мен класстар арқылы жалғыз мұрагерлікті
қолдайды. Оларды өз қалауларына қарай жүзеге асыра отырып, бірнеше базалық
интерфейстердің қасиетін туынды классқа беруге мүмкіндік береді.
4.1 Интерфейске сілтеме алу

С++ интерфейс мүшелеріне бірнеше әдістермен қарауға мүмкіндік береді.
Бірінші әдіс: Мысалы, IAction интерфейсі жүзеге асатын анық
келтірілген класс объектісінен IAction интерфейсіне сілтеме аламыз (сонымен
объект IAction интерфейсін қолдайды). IAction-де қолдамайтын объект
класына анық келтіруді қолданса, онда InvalidCastException ерекшелік
генерациясы мен орындау уақытының
қателігі туралы хабарлама аламыз.
Ерекшелік мәселесінен қашу (құрылу) үшін, оны қайта ұстау қажет:
I Action ref;
Try
{ ref = (IAction) объект;
Console.WriteLine (ref.F());
}
Catch (InvalidCastException )
{ Console.WriteLine (“Oshibka...”);}

Екінші әдіс: as кілттік сөзін қолдана отырып,интерфейстен сілтеме
алады.
I Action ref;
ref = объект as I Action;
Бұл әрекет (операция берілген типтің объектісіне түрлендіруді
орындайды,ал егер бұл мүмкіндік болмаса, нәтижесін null деп шығарады.
Үшінші әдісте:интерфейске сілтеме алу үшін is операторы қолданыла-
ды(жүргізіледі).Егер объект интерфейсті қолдамаса, онда шарт false
тең болады.
Біз object типінің параметірінің әдісі түріндегі объектінің қандай
да бір әрекетін суреттейік.Бұл параметірді туынды класстарда көрсетілген
әдіске көңіл аудару үшін әдісті қолданбастан бұрын,туынды классқа параметр
түрлерін өзгертуді орындауды қажет етеді.Қауіпсіз түрлендіру үшін сол
мүмкін болатынша тексеру жүргізу қажет.Мысалы былай:
Static void Act (object obj)
{if (obj is IAction) түрлендіру жүргізуді тексеру
{IAction ref=(IAction) obj; анық түрлендіру
ref.F();
}
}
Act() әдісін кез келген оъектілерге жіберу болады, бірақ өңдеу тек
IAction интерфейсін қабылдайтын объектілер үшін жүргізіледі.Қарастырыл-
ған екі әрекетте (операцияда) интерфейстерге де, кластарғада
қолданылады.
Интерфейстерді арнайы айнымалылар ретінде қарастыруға болады.C++-те
интерфейстерді қабылдайтын және қайтарылатын параметрлер сияқты қолдануға
мүмкіндік береді.Егер интерфейсті параметр ретінде алатын қандай да бір
әдісті анықтаса,онда осы интерфейсті қабылдайтын кез келген объектіні
әдіске жай ғана жіберуге болады.
Шындығында, бір мезгілде негізгі және интерфейсті жүзеге асыратын
туынды класстарды құру жағдайы мүмкін, бірақ осы екі жағдайда да бір атты
әдіс негізгі мұрагерленген немесе интерфейстен алынған болып шығады.
Public class Der:nBase,IAction
{public override void F() { ... .}
}
Der классындағы объектіге мына түрде қарасақ не болады:
Басқа жағдай IAction ref=(IAction) obj; ref.F(); әдісін шақыруға
болады:
F() Der класс екі абстрактілі әдістер үшін толық мүмкін болатын
бірдей нақты жүзеге асыруды ұсынады.Кейін бұл әдісті объект классындағы
сілтеме немесе интерфейске сілтеме арқылы шақырсақта, бәрібір сол әдіс
нұсқасы шақырылатын болады.
Интерфейс әдісіне () тек интерфейс сілтемесі арқылы,(объекті сілтемесі
арқылы емес) көшуге қалай болады? Жауабы: класстағы анық іске асыру
интерфейсін қолданарда:жүзеге асатын элементтің алдында интерфейстің нақты
атын көрсету керек.Бұл кезде спецификаторларға жетімді болғанда
қолданылмайды.Мұндай элементтерге интерфейс түрінің объектісі арқылы
программада көңіл аударуға болады.Сол себептен жүзеге асыратын интерфейстің
атын анық берерде оны егер қандай да бір интерфейс элементтері соңғы
класстың қолданылуын қажет етпейтіндей қысқартуға мүмкін берген кезде
сәйкес әдіс интерфейс классына кірмейді.

4.2 Интерфейстер мен мұрагерлер.

Бұл дәрісте интерфейстер иерархиясын, және көптеген іс-
әрекеттерді қабылдайтын типтерді құрумен танысамыз. Сонымен бірге (.NET
негізі кластар кітапханасында анықталған стандартты интерфейстерді)
корпоротивті объектілерді сұрыптау мен есептеу мүмкіндіктерін жүзеге асыру
үшін ( ) қарастырамыз.
Интерфейс бабалар интерфейстерін бірнеше рет қабылдауы немесе
қабылдамауы мүмкін. Негізгі интерфейстер олардың ұрпақтарына қарағанда аз
емес деңгейде жетімді болуы мүмкін.
Рublic интерфейсін негізі ретінде private немесе internal
спецификаторларымен өрнектелген интерфейстерді қолдануға болмайды. Жай
класстар иерархиясы сияқты, негізгі интерфейс жалпы іс-әрекетті анықтайды,
ал оның ұрпағы оларды толықтап және нақтылап отырады. Ұрпақ – интерфейсінде
сигнатурадай мұрагерлік элементтерді қайта анықтайтын элементтерді
көрсетуге болады. Бұл жағдайда көрінбейтін негізгі интерфейс сәйкес
элементінің көмегімен элемент алдына new кілттік сөзі көрсетіледі.
Интерфейсті жүзеге асыратын класс мұрагерлік және барлық оның
элементтерін анықтау қажет. Жай интерфейстер иерархиясын мына түрде жазуға
болады:
interface IBase {void F();}
базалық интерфейс
interface IDer: IBase {void G();}
interface IDerDer: IDer {void Q();}
Егер біздің класс барлық 2 анықталған интерфейстердің іс-әрекетін
қолдайтын болса, онда өлең төменгі деңгейдегі интерфейстерден өңделуі
қажет. Барлық әдістер негізгі интерфейстерде анықталған автоматты түрде
туынды интерфейстерге қосылады:
public class Test : IDerDer
{
void IBase. F() { ... }
void IDer. G() { ... }
void IDerDer. Q() { ... }
}
Test классын мына түрде практикада қолдануға болады:
Test t = new Test ();
IBase refB = (IBase)t; refB– ссылка на
интерфейс IBase
refB.F();
а теперь получаем ссылку на
интерфейс IDerDer
if (refB is IDerDer)
{ IDerDer refDD = (IDerDer) refB;
refDD.G();
refDD.Q();
}
Класс өзінің бабаларының (барлық әдістерін) интерфейстер жүзеге
асырғанда мұрагерлікке алады. Ол осы әдістерді new спецификатор көмегімен
қайта анықтайды, бірақ оған тек осы класс объектісі арқылы көңіл аудару
қолданылмаса, онда қайта анықталмаған нұсқасы шақырылады:
interface IBase {void F();}
class Base: IBase {public void F() { ... .}}
class Derived: Base {new public void F() { ... }}
... .
Derived d = new Derived();
d.F();
Derived.F()
IBase ref = d;
ref.F();
Base.F()
Бірақ егер интерфейс класстың виртуалды әдісі көмегімен жүзеге
асырылса, оны қайта анықталғаннан кейін ұрпақтарындағы немесе нұсқасы бір
нәтиже алып келеді, онда d.F() шақырылуы бар немесе ref.F() Derived.F();
әдісін шақыратын болады.
Анық көрсетілген атпен жүзеге асырылатын интерфейс әдісін виртуалды
шақыруға тиым салынады. Оның ұрпақтардаға іс-әрекеттің қайта анықтау қажет
болса келесі қабылдауды қолданады: осы әдістен виртуалды деп анықталған
басқа қорғалған әдіс шақырылады.
Бұл интерфейсті жүзеге асырған бабалар класымен бірге ұрпақтар
класындағы тізімде оны атын көрсетіп, интерфейсті қайта жүзеге асыру
мүмкіндігі туады. Негізгі класстағы қайта анықталған әдістерді жүзеге асыру
көңілге алынбайды.
interface IBase{void F();}
class Base: IBase {void IBase.F() { ... }}
class Derived: Base, IBase {public void F(...)}
Егер бірдей сигнатурамен өрнектелген әдістер интерфейс пен класстарды
мұрагерлесе, онда мұрагерленген класс әдісі интерфейсті жүзеге асырғандай
қабылданады, мысалы:
interface Interface {void F();}
class Base{public void F() { ... } public void G() { ... }}
class Der: Base, Interface {new public void G(){...}}
Мұндай Der классы Base классынан F() әдісімен мұрагерленеді, интерфейс
F() әдісін де қабылдайды. Интерфейсті жүзеге асыру үшін жүргізілген әдіс
Der классында болса, онда компилятор қатені шығармайды.
Интерфейсті іске асыру кезінде олардың класста болуына тәуелсіз
“тиімді” әдістер ескеріледі. Бұл анықталған немесе анықталмаған түрдегі
интерфейсті жүзеге асыратын базалық класста өрнектелген әдіс болуы мүмкін.
С++, классикалық СОМ-ға қарағанда бірнеше базалық интерфейстермен
мұрагерлікке жол береді.
.NET класстарындағы библиотекада объектілерді іс-әрекетіне қарай
қойылған стандартты интерфейстар жиыны анықталған. Мысалы IСomparable
интерфейсі олардың сұрыптауының орындалуына мүмкіндік беретін объетілерді
салыстыру әдісін береді. IЕnumerable және IЕnumerator интерфейстерін жүзеге
асыру foreach конструкциясының көмегімен объектінің мазмұнын қарауға, ал
IСloneable интерфейсін жүзеге асыру объетілерінің еңкеюіне мүмкіндік
береді. Стандартты интерфейстер көптеген стандартты класстағы
кітапханаларды қолдайды. Мысалы, Array типтегі foreach циклінің көмегімен
массивтердің жұмысын IЕnumerable және IЕnumerator интерфейстерімен жүзеге
асырады.
Стандартты әдістермен осы класстар объектілерін қолдануға мүмкіндік
беретін стандартты интерфейстерді көтермелейтін жеке класстар құруға
болады.
Басқа аналогты ортадағы объектілердің орнын анықтауға мүмкіндік
беретін IComparable интерфейсін (мысалға) қарастырайық:
interface IComparable {int CompareTo (object o);}
Мысалы, CarID ішкі идентификатор мен автомобильді қабылдайтын Car
класын қарастырайық. Car объектілер массивін құрдық делік. Егер CarID
идентификаторлық массив объектілеренің реттелуі үшін System.Array классты
Sort() әдісін қолдансақ, онда Array қате болады. Есеп шешімін табады, егер
Icomparable интерфейсін қолдайтын объект болса және CompareTo() әдісінің
жүзеге асырылуына байланысты болса. CarID идентификатор мәнін сәйкес осы
әдісті жүзеге асыруға мысал келтіреміз:
public class Car: IComparable
{ ...
int IComparable.CompareTo(object obj) .
{ Car temp = Car(obj);
if (this.CarID temp.CarID) return 1;
if (this.CarID temp.CarID) return -1;
else return 0;
}
}
Sort() стандартты әдісінің көмегімен Car объектісіне сұрыптау
жүргізуге болады:

public class Test
{ public static void ... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Мектепте алгоритмдеу және Паскаль тілін оқыту әдістемесі
С биоцентрлік координаттар негізінде үшбұрыштарды растеризациялау
С C ТІЛДЕРІ НЕГІЗДЕРІ. С С тілдерінде жазылған программаның құрылымы
Бағдарлы оқытуды ұйымдастырудың негіздері
Паскаль тілінде сызықтық бағдарлама құру
Бағдарламалық қамсыздандыруды орнықтыру
Әріптерден сөз жасау
Турбо Паскалль тілінің негізгі элементтері
Java бағдарламалау тілі
ОҚУШЫЛАРДЫҢ АЛГОРИТМДІК ОЙЛАУ ҚАБІЛЕТІН ОҚЫТУ МЕН ОНЫ ЖЕТІЛДІРУ
Пәндер