Object класы

Алдында айтып өткендей, System.Object класы басынан.NET кластарын мұралайды. Егер жаңа класты ашу кезінде базалық класс көрсетілмесе, компилятор автоматты түрде оның Object класынан мұраланып тұр деп есептейді. Бұл бөлімде мұралау қолданбайды дегенмен, сіздер көріп тұрған барлық кластар негізінде Object класынан мұраланып тұр. (жоғарыда көрсетілгендей құрылым үшін мұралау түзу емес. Құрылым System.ValueType класы арқылы мұраланып тұр, ал ол өз кезегінде System.Object класы арқылы мұраланып тұр.)

Практикалық мәні: сіз анықтайтын әдістер мен қасиеттерден бөлек, Object класында анықталған жалпы және қорғалған әдістер мен қасиеттер пайда болады. Бұл әдістер барлық анықталған кластарда қатысады.


10. Мұралау. Мұралау типі. Іске асыруды (реализация) мұралау.

Объектіге бағытталған программалау тілінде мұралаудың екі түрі бар: іске асыруды мұралау және интерфейсті мұралау.

1. іске асыруды мұралау дегеніміз тип базалық типтен барлық жол мүшелері мен функция мүшелерін ала отырып іске асатын мұралау түрі. Іске асыруды мұралау кезінде туынды тип базалық типтің әрбір функциясына адаптацияланады. Мұрагерліктің бұл типі бар типке функциональдылық қасиетін қосу үшін қажет болғанда пайдаланылады. Онымен қоса, бірнеше байланысқан типтер ортақ функциональдылық көлемін бөліп тұрған кезде осы типті қолданған қолайлы.

2. Интерфейсті мұралау. бұл тип тек функция сигнатурасына мұраланады. Бірақ ешқандай іске асыруды мұраламайды. Мұралаудың бұл типі белгелеі бір құралдарға қол жетімділік болу үшін оларды спецификациялау кезінде қолданған қолайлы болып келеді.

С# тілінде іске асыру мұрагерлігін де интерфейс мұрагерлерлігін де іске асыруға болады. Бұл типтердің екеуі де С# программалау тілі құрастырғалы қолданылып келеді.

· Құрылымдар system.ValueType арқылы мұраланады. Олар кез келген көлемді интерфейсті мұрагерлей алады.

· Кластар әрқашан сіз таңдаған белгілі бір класты мұралайды. Онымен қоса олар кез келген көлемді интерфейсті мұрагерлей алады.

Іске асыруды мұралау.Клас басқа кластан мұраланатынын хабарлау үшін келесі синтаксис қолданылады:

Class мұраланған класс:Базалық класс

{ // мәліметтер-мүшесі және функция-мүшелер }

Егер клас интерфейстарді мұраласа, онда базалық кластың және интерфейстердің тізімі үтір арқылы орналасады:

Public class MyDerivedClass: MyBaseClass, IInterface1, IInterface2

{ // және т.б. }

Егер класты анықтауды базалық класс көрсетілмеген болса, онда C# компиляторы базалық класс System.Object деп шешеді. Сол себепті келесі код фрагменттері өзара эквивалетті болады:

1) Class Myclass: Object // System.Object арқылы мұраланады.

{ // және т.б. }

2) Class Myclass: Object // System.Object арқылы мұраланады.

{ // және т.б. }

Object класына бағытталуы үшін Object кілттік сөзін қолданыңыз, ол Visual Studio.NET интелектулды редакторларымен анықталады.


11. Мұралау. Рұқсат модификаторлары. Интерфейстер.

Модификаторлар public және private әдістерін көрсетілуін қамтамасыз ете алады. Онымен қоса олардың virtual және abstract екендігн анықтай алады. C# тілінде модификатордың көптеген түрі анықталған.

Рұқсат модификаторлары.

Модификатор Сипаттамасы
Public Элемент кез келген баска кодта көрінеді.
Protected Элемент тек кез келген туынды типке көрінеді.
Internal Элемент тек шектелген құрылымда көрінеді.
Private Элемент тек өзі байланысты тип шегінде көрсетіледі.
Protected interval Элемент тек шектелген құрылымда және кез келген туынды тип кодында көрінеді

Егер қосылған тип бар болатын болса, ол сыртқы тип мүшелерінің бәріне кіруге рұқсаты бар.

Басқа қосымша модификаторлар

Модификатор Сипаттамасы
New Бұл мүше сол сигнатурамен мұраланған мүшені көрсетпейді
Static Бұл мүше нақты клас экземплярымен байланысты емес
Virtual Мүше мұрагерлік кластарда кайта анықтауы мүмкін.
Abstract Сигнатураны анықтайтынғ бірақ іске асыруды жасамайтын виртиалды мүше
Override Базалық кластың мұраланған виртуалды немесе абстракты мүшесін қайта анықтайды.
Sealed Басқа кластарға осы кластан мұралауға болмайтынын айтады.
Extern Бұл мүше басқа тілде,сыртқы түрде жасалған

Интерфейстер

Объектіге бағытталған тілдер интерфейстерді қолдана алатындығына байланысты біз С# программалау тіліндегі интерфейстерді іске асруды қарастырайық. Біз IDisposable интерфейс қарастырайық.

Егер класс Dispose() әдісін іске асыруын хабарлағысы келсе, онда ол IDisposable интерфейсін іске асыруы керек, C# терминінде ол IDisposable мұраланады деп есептеледі.

Интерфейсті анықтау және іске асыру.

Код атын интерфейс екенін түсіну үшін келісім бойынша I әрпінен бастаймыз.

Мысалы сіз жазып шығарған код арқылы банктік ақша алмасуына арналған. Кез келген осындай код IBankAccount интерфейсін іске асыруы міндетті. Бұл интерфейс арқала әр түрлі шоттардың кластарын анықтауға жол ашады.

Туынды интерфейстер

Интерфейстер класстар сияқты бір бірі арқылы мұралана алады.


12. Жалпылау. Жалпылауға шолу. Жалпыланған кластар құру.

Жалпылау – бұл параметрлі тип. Төменде жалпылау класын хабарлау-ң жалпы формасы көрсетілген:

class класс_аты<тип_параметр-ң_тізімі> { //...

Ал былай жалпылау класқа сілтеме жібреу синтаксисі көрсетілген:

класс_аты<тип_аргумент-ң_тізімі> айнымалы_аты =

new класс_аты< тип_параметр-ң_тізімі > (тип_аргумент-ң_тізімі);

Мысалдар келтірсек:

namespace ConsoleApplication1

// Т параметрі бар жалпылау класын құрайық

class MyObj<T>

{

T obj,

public MyObj(T obj)

{

this.obj = obj;

}

public void objectType()

{

Console.WriteLine("Тип объекта: " + typeof(T));

}

}

// Бірнеше параметрі бар жалпылау класы

class MyObjects<T, V, E>

{

T obj1;

V obj2;

E obj3;

public MyObjects(T obj1, V obj2, E obj3)

{

this.obj1 = obj1;

this.obj2 = obj2;

this.obj3 = obj3;

}

public void objectsType()

{

Console.WriteLine("\nТип объекта 1: " + typeof(T)+

"\nТип объекта 2: " + typeof(V) +

"\nТип объекта 3: " + typeof(E));

}

}

class Program

{

static void Main()

{

// int жалпыланған клас-ң экземпляры

MyObj<int> obj1 = new MyObj<int>(25);

obj1.objectType();

MyObjects<string, byte, decimal> obj2 = new MyObjects<string, byte, decimal>("Alex",26,12.333m);

obj2.objectsType();

Console.ReadLine();

}

}

}

MyObj класы үшін аргумент типі көрсетілгенде, м/лы, int н/е string, онда С#-да құрастылылған(сконструированный) д.а. тип құрылады. Сон.қат., MyObj<int> жабық құрастырылған тип болып табылады. С/бі, шынайы келгенде, MyObj<T> сияқты жалпыланған тип-абстракция. Нақты вариант құрылғаннан кейін, м/ға MyObj<int>, нақты тип құрылады. Ал MyObj<T> сияқты конструкция, С#-та ашық құрастырылған, с/бі онда int секәлдә нақты тип емес, Т параметр типі көрсетіледі.

Ашық тип деп аргумент параметр типі н/е оны өзіне қосатын параметр типі н/е кез келген жалпыланған тип саналады. Ал ашық типке жатпайтын кез келген тип жабық тип боп есептеледі. Құрастырылған тип д-міз тип-ң барлық аргументі көрсетілген жалыпланған тип.

Тағы да бір жағдай. Мынадай сұрақ тууы мүмкін: MyObj жалпылау класы-ң дәл осындай функционалдық мүмкіндік-н жалпылаусыз-ақ алуға болады, жай ғана объектті дерек-р типі ретінде көрсетіп, типті тиісті келтіруді орындау арқылы. Онда MyObj класын жалпылаудан не пайда? Жалпылау автоматты түрде MyObj класына қатысты барлық операция-ң типтік қауіпсіздігін қамтамасыз етеді.


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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: