Алматы экономика және статистика академиясы



Pdf көрінісі
бет6/11
Дата07.04.2017
өлшемі1,49 Mb.
#11217
1   2   3   4   5   6   7   8   9   10   11

 

9-

шы лекция. Кластардың негізгі элементтері: өрістерді, тәсілдерді, 

конструкторларды, қасиеттерді  пайдалану жолдары  

 

 



1.Кластар туралы жалпы мәліметтер 

 

2. Класс спецификаторлары 

 

3. Класс объектілерін жасау 

      

3.1. Объектілерді меншіктеу және салыстыру 

      3.2. 

Мәліметтер: өрістер мен константалар  

 

4. Класс өрісінің спецификаторлары мен константалары 

 

5. Тәсілдер  

42 

 

     



5.1.Тәсілдер параметрлері 

     

5.2. Тәсілді шақыру  

     

5.3. Параметрлерді беру тәсілдері және     олардың типтері 

     

5.4. Параметрлерді қолдану ережелері 

6. this түйінді сөзі  

7. Конструкторлар 

8. Қасиеттер  

 

Класс сипаттамасы class түйінді сөзі мен класс атынан тұрады да, жүйелі жақша 

ішінде класс тұлғасы – оның элементтері тізімі орналасады. Бұларға қоса, кластың 

базалық элементтерін (тегі-предки) және әртүрлі сипаттары анықталатын, міндетті емес 

бірсыпыра атрибуттары мен спецификаторларын беруге болады. 

3.2. Мәліметтер: өрістер мен константалар  

4. Класс өрісі спецификаторлары мен константалары 

Класс мысалы 

5. Тәсілдер  

Тәсіл — класпен немесе экземплярмен атқарылатын есептеу-лерді орындайтын 

функционалдық элемент. Тәсілдер кластың тәртібін анықтайды да, оның интерфейсін 

құрайды. 

Тәсіл — аты арқылы пайдалануға болатын, аяқталған  код фрагменті. Ол бір рет 

жазылады да, қанша рет қажет болса, сонша рет шақырылып орындала береді.  

Бір тәсіл оған аргумент ретінде берілген әртүрлі мәліметтерді өңдей алады. 

Төмендегі мысалға қараңыз: 

Тәсіл синтаксисі  

Тәсілдер мысалдары 



5.1.Тәсілдер параметрлері 

Қарапайым тәсіл мысалы 



5.2. Тәсілді шақыру  

Тәсілге параметрлерді беру мысалы 

using System; 

namespace Lisning5_3 {  

class Class1 

    


{   static int Max(int a, int b)       // макс. мәнді таңдау 

        { 

            if ( a > b ) return a; 

            else          return b; 

        } 

        static void Main() 

        { 

            int a = 2, b = 4; 

            

int x = Max( a, b );        // Max тәсілін шақыру 

            

Console.WriteLine( x );                 // нәтижесі: 4 

            short t1 = 3, t2 = 4; 

            

int y = Max( t1, t2 );      // үйлесімді тип пар-рлері 

            

Console.WriteLine( y );                 // нәтижесі : 4 

            

int z = Max( a + t1, t1 / 2 * b );   // өрнек 

            

Console.WriteLine( z );                 // нәтижесі : 5 

}}}  


5.3. Параметрлерді беру тәсілдері және   олардың типтері 

Параметрлерді беру тәсілдері: мән бойынша және сілтеме бойынша. 



Параметрлерді мән бойынша беру кезінде тәсіл аргументтер мәнінің көшірмелерін 

алады да, тәсіл операторлары осы көшірмелермен жұмыс істейді.  



43 

 

Параметрлерді  сілтеме  (адрес) бойынша беру кезінде тәсіл аргументтер адресінің 

көшірмесін алады да, сол (бұрынғы) адрестердегі аргументтерді пайдаланады.  

С# тілінде параметрлердің төрт типі бар: 

мән-параметрлер; 

сілтеме-параметрлер (ref); 

нәтижелік (шығыс - выходные) параметрлер (out); 

жиым-параметрлер (params). 



     

Түйінді сөздер параметрлер типтерін сипаттаудың алдында тұрады. Егер ол 

болмаса, параметр мән-параметр болып есептеледі. Мысалы: 

     public int Calculate( int a, ref int b, out int c, params int[] d ) …  

Мысал: мән-параметрлер мен ref сілтемелері 

using System; 

namespace Listing5_4 

{   class Class1 

    {   static void P( int a, ref int b ) 

        { 

            a = 44; b = 33; 

            

Console.WriteLine( "тәсіл ішінде {0} {1}", a, b ); 

        } 

static void Main() 

        { 

            int a = 2, b = 4; 

            

Console.WriteLine( "шақыруға дейін   {0} {1}", a, b ); 

            P( a, ref b ); 

            

Console.WriteLine("шақырудан кейін  {0} {1}", a, b ); 

}}} 

Мысал: out шығыс параметрлері 



using System; 

namespace Listing5_5 

{   class Class1 

    {   static void P( int x, out int y )  

        { 

            x = 44; y = 33; 

            

Console.WriteLine( " тәсіл ішінде {0} {1}", x, y ); 

        } 

static void Main() 

        { 

            int a = 2, b;         // b-

ны инициалдау қажет емес 



P( a, out b ); 

            

Console.WriteLine( "шақырудан кейін  {0} {1}", a, b ); 

}}} 


    

5.4. Параметрлерді қолдану ережелері 

1.

 



Мән-параметрлер  үшін  мән  бойынша  параметр  беру  қолданылады. 

Бұл мүмкіндік тәсілдің бастапқы мәліметтері үшін қолданылады.    

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

мүмкін (және де оның жеке жағдайы ретінде  — айнымалы немесе константа). Мұнда 

өрнек типі параметр типіне келтірілуі керек. 

2.

 



Сілтеме-параметрлер  және  нәтижелік  (шығыс)  параметрлер  адрес 

бойынша  беріледі.  Мұндай  мүмкіндік  тәсілдің  қосалқы  нәтижелерін    (побочные 

результаты) беру кезінде қолданылады.  


44 

 

Тәсілді шақыру кезінде ref сілтемесі бойынша берілетін параметр орнында тек сол 



типтегі инициалданған айнымалы аты ғана болуы мүмкін. Параметр аты алдында  ref 

түйінді сөзі көрсетіледі.   

Тәсілді шақыру кезінде out нәтижелік (шығыс) параметр орнында тек сол типтегі 

айнымалы аты ғана болуы мүмкін. Оны инициалдау қажет емес. Параметр аты алдында 

out түйінді сөзі көрсетіледі.   

6. this түйінді сөзі  

Тәсілдің ол өңдеуге тиіс объект өрісімен жұмыс істеуін қамтамасыз ету үшін,  сол 

тәсілге автоматты түрде this жасырын параметрі беріледі, ол функцияны шақырған 

объектіге сілтеме жасап тұрады.  

this сөзін нақты түрде пайдалану  

this параметрі тікелей түрде мынадай жағдайларда қолданылады:  

// тәсілден оны шақырған объектіге сілтеме қайтару үшін: 

class Demo     

{        double y;  

        public Demo T()    { return this; } 

//  

аты тәсіл параметрі атымен бірдей өрісті идентификациялауүшін: 



        public void Sety( double y ) { this.y = y; } 



7. Конструкторлар 

Конструктор объектіні инициалдау үшін қажет. Ол класс  объектісін жасау кезінде  

new операциясы арқылы шақырылады. Конструктор аты класс атымен бірдей болады.  

Конструкторлар қасиеттері: 

Конструктор ешқандай мән (тіпті void типін де) қайтармайды. 

Кластың, инициалдаудың әр түрлері үшін әртүрлі параметрлері бар, бірнеше 

конструкторлары болуы мүмкін. 

Егер программалаушы бірде-бір конструкторды көрсетпесе немесе кейбір өрістер 

инициалданбаса, мәндік типтегі өрістерге — нөл, ал сілтемелік типтегі өрістерге — null 

мәні меншіктеледі. 

Параметрсіз шақырылатын конструктор (үнсіз) келісім бойынша алынған 

конструктор деп аталады. 

Конструкторы бар класс мысалы  

using System; 

namespace Listing5_6  { 

class Demo 

    { 


        

public Demo( int a, double y )         // конструктор 

        { 

            this.a = a; 

            this.y = y; 

        } 

        int a;    

        double y; 

    } 

 

    class Class1 



    {   static void Main() 

        { 

            

Demo a = new Demo( 300, 0.002 ); // конструкторды шақыру 

            

Console.WriteLine( a.Gety() );       // нәтиже: 0,002  

            

Demo b = new Demo( 1, 5.71 );       // конструкторды шақыру 

            

Console.WriteLine( b.Gety() );      // нәтиже : 5,71  



45 

 

   } } } 



Екі конструкторы бар класс мысалы  

class Demo 

    { 

        


public Demo( int a )                   //  1 конструктор 

        { 

            this.a = a; 

            this.y = 0.002; 

        } 

        


public Demo( double y )                // 2 конструктор 

        { 

            this.a = 1; 

            this.y = y; 

        } 

        ... 

    } 

        ... 



            

Demo x = new Demo( 300 );    // 1 конструкторды шақыру 

            

Demo y = new Demo( 5.71 );   // 2 конструкторды шақыру 

Жалпы класс мысалы 

class Monster { 



public Monster()      // конструктор 

    { 

            this.name  = "Noname"; 

            this.health = 100; 

            this.ammo = 100; 

    } 

  public Monster( string name ) : this() 

    { 

            this.name = name; 

     } 

  public Monster( int health, int ammo, string name ) 

     { 

            this.name  = name; 

            this.health = health; 

            this.ammo = ammo; 

     } 

  public 

int GetName()          // тәсіл 

    {  return name;   } 

  

public int GetAmmo()        // тәсіл 



     {  return ammo;} 

 

8. Қасиеттер 

Қасиеттер класс өрістерімен қатынас құру үшін пайдаланылады. Көбінесе, қасиет 

жабық өрістермен қатынас құру тәсілдерін анықтайды.  

Қасиет синтаксисі: 

[ спецификаторлар ]  типі  қасиет_аты 

{ 

    

[ get  қатынасу_коды ] 

    

[ set  қатынасу_коды ] 

} 


46 

 

Қасиеттерді пайдалану кезінде, автоматты түрде онда көрсетілген оқу (get) және 



орнату (set) блоктары шақырылады. 

Мұнда не get, не set бөлігі болмауы мүмкін, бірақ екеуінің де бірден жоқ болуы 

мүмкін емес. Егер set бөлігі болмаса, қасиет тек оқылады (read-only), ал егер get бөлігі 

болмаса – тек жазылады (write-only). 



 

10-

шы лекция. Класc тәсілдері мен операцияларының асыра жүктелуі  

 

 



Рекурсивтік тәсілдер, параметрлер саны айнымалы тәсілдер; 

 



Индексаторлар;  

 



Деструкторлар. 

 

Аргументтер саны айнымалы тәсілдер  

class Class1  { 

     public static double Average( params int[] a ) { 

         if ( a.Length == 0 )  

                      

throw new Exception( «Аргументтері жеткіліксіз"); 

            double sum = 0; 

            foreach ( int elem in a ) sum += elem; 

            return sum / a.Length; 

        } 

        static void Main()    {   try   { 

                int[] a = { 10, 20, 30 }; 

                Console.WriteLine( Average( a ) );            // 1 

                int[] b = { -11, -4, 12, 14, 32, -1, 28 }; 

                Console.WriteLine( Average( b ) );            // 2 

                short z = 1, e = 13; 

                byte v = 100; 

                Console.WriteLine( Average( z, e, v ) );      // 3 

                Console.WriteLine( Average() );                // 4 

            } 

            catch( Exception e ) {Console.WriteLine( e.Message ); return; } 

    }}  

 

Рекурсивтік тәсілдер  

Рекурсивтік деп өзін-өзі шақыратын (тура рекурсия) тәсілді атайды. Екі немесе одан 

да көп тәсілдер бірін-бірі шақыратын болса, олар – жанама рекурсия деп аталады.  

Есептеулерді аяқтау үшін әрбір рекурсивтік тәсілдің кем дегенде бір қайтару 

операторымен аяқталатын рекурсивтік емес алгоритм тармағы болуы керек.  

long fact( long n ) { 

    


if ( n == 0 || n == 1 ) return 1;        // рекурсивтік емес тармақ 

    return ( n * fact( n – 

1 ) );                // рекурсивтік тармақ 

… long m=fact(4); 



// немесе: 

long fact( long n ) { return ( n > 1 ) ? n * fact( n – 1 ) : 1; } 



 

Рекурсияның сипаттамалары 

Рекурсияның артықшылығы: программа қысқа, әрі ықшам жазылады. 

Кемшіліктері:стектің толып кету қаупі бар; тәсілді қайталап шақыруға және оған 

параметрлердің көшірмелерін жіберуге уақыт пен жадының қажеттілігі. 



 

47 

 

Тәсілдердің асыра жүктелуі  

Атаулары бірдей, бірақ параметрлерінің типтері әртүрлі бірнеше тәсілдерді қатар 

қолдану тәсілдердің асыра жүктелуі деп аталады.  

Компилятор берілген нақты параметрлердің типі бойынша қандай тәсілді шақыру 

керектігін анықтайды. Бұл асыра жүктелуге рұқсат беру (resolution) деп аталады.  

// Екі бүтін санның үлкенінің мәнін қайтарады: 

int max( int a, int b ) 

// Үш бүтін санның үлкені мәнін қайтарады: 

int max( int a, int b, int c ) 

// Бірінші параметрдің мәні үлкенін және екінші параметрдің ұзындығының үлкенін 

қайтарады: 

int max ( int a, string b ) 

... 


Console.WriteLine( max( 1, 2 ) ); 

Console.WriteLine( max( 1, 2, 3 ) ); 

Console.WriteLine( max( 1, "2" ) ); 

Тәсілдердің асыра жүктелуі полиморфизм көрінісі болып табылады.  



Класс операциялары  

С# тіліндегі кластардың өз ішкі операцияларының басым бөлігі әрекеттерін қайта 

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

объект экземплярларын қолдануға мүмкіндік береді: 

     MyObject a, b, c;  ...   

     


c = a + b;                // MyObject класының қосу операциясы  

Кластың өз операцияларын анықтау операциялардың асыра жүктелуі деп аталады.  

Класс операциялары арнайы түрдегі тәсілдер (функция-операциялар) арқылы былай 

сипатталады: 



                     

public staticоперацияны_жариялаушы{ тұлға }  

Мысалы:   public static MyObject operator --( MyObject m ) { … } 

C# тілінде класс операцияларының 3 түрі бар: унарлы, бинарлы және типті 

түрлендіру операциялары. 



Классоперацияларын сипаттаудың жалпы ережелері 

Операция кластың ашық статикалық тәсілі ретінде сипатталуы тиіс (public static 

спецификаторлары); 

параметрлер операцияларға мәні бойынша берілуі тиіс (яғни, операция алдына ref 

немесе out түйінді сөздері жазылмауы тиіс); 

Кластың барлық операцияларының сигнатуралары әртүрлі болуы тиіс; 

операцияда қолданылатын типтер операциялардың өздерінен кем болмайтындай қатынас 

құқықтарына ие болуы тиіс (яғни операцияларды қолданған кезде параметрлерге де қол 

жеткізуге болады). 

11-

ші лекция. Кластарды мұралау 

 



 

Кластар иерархияларын (сатыларын) ұйымдастыру; 

 



Алдыңғы және соңғы байланыстыру; 

 



Виртуалды тәсілдер;  

 



Абстрактілі және туындысыз кластар;  

 



Кластар арасындағы өзара қатынас түрлері. 

 

Мұралау мүмкіндіктері 

 

Мұралау ОБП-дың қуатты құралы болып табылады. Ол ұрпақ-кластардың ата-



кластар қасиеттерін иемденетін және оларды толықтыру немесе өзгерту 

мүмкіндігіне ие болатын иерархияларды құруға мүмкіндік береді. 



48 

 



 

Мұралау төмендегідей өзара байланысты мақсаттар үшін қолданылады: 

 

программадан қайталанатын код фрагменттерін жою; 



 

программаны өзгертуді жеңілдету; 



 

бұрын құрылған программалар негізінде жаңа программалар құруды жеңілдету. 



 

Сонымен қатар, программалардың бастапқы кодын пайдалануға  мүмкіндік 



болмайтын жағдайда, оларға өзгеріс енгізуді қажет ететін объектілерді 

қолданудың жалғыз мүмкіндігі – осы мұралау болып табылады.  



Синтаксисі (жазылуы): 

[ атрибуттар ] [ спецификаторлар ] class класс_аты [ :ата_тектері ] 

    

класс тұлғасы 

 class Monster  

    

{  ... // private және public-тен басқа,  



            // protected 

қолданылады 

    } 

        class Daemon : Monster 



    {   ...  

    } 


 

C# тілінде кластың ұрпақтары саны бірнешеу болуы мүмкін  



 

Кластың тек бір ата-кластан және интерфейстердің кез келген санынан мұралау 



мүмкіндігі бар. 

 



Мұралау кезінде ұрпағы ата-тегінің барлық элементтерін қабылдайды.  

 



private элементтерін оның ұрпақтары тікелей пайдалана алмайды. 

 



protected элементтерін тек ұрпақтары пайдалана алады. 

Кластың жалпы мысалы 

class Monster { 

    public Monster()      // 

конструктор 

    { 

            this.name  = "Noname"; 



            this.health = 100; 

            this.ammo = 100; 

    } 

  public Monster( string name ) : this() 



    {      this.name = name;     } 

  public Monster( int health, int ammo, string name ) 

     {     this.name  = name; 

            this.health = health; 

            this.ammo = ammo; 

     } 


 public int Health {          // 

қасиет 


   get { return health;  } 

   set { if (value > 0) health = value; 

           else               health = 0; } 

 } 


public int Ammo {          // 

қасиет 


   get { return ammo;  } 

   set { if (value > 0) ammo = value; 

           else               ammo = 0; } 

 } 


 public string Name {          // 

қасиет 


   get { return name;  } 

  



 

 

 



 

-





49 

 

 public void Passport()               // 



тәсіл 

     {   Console.WriteLine(  

  "Monster {0} \t health = {1} \ 

    ammo = {2}", name, health, ammo ); 

      } 

public override string ToString(){ 

 

string buf = string.Format( 



       "Monster {0} \t health = {1} \ 

     ammo = {2}", name, health, ammo); 

    return buf;  } 

string name;      // private 

өрістер 


  int health, ammo; 

Daemon, Monster 

класының мұрагері 

class Daemon : Monster { 

     public Daemon() {   brain = 1;     } 

     public Daemon( string name, int brain ) : base( name )  this.brain = brain;   } 

     public Daemon( int health, int ammo, string name, int brain )  

            : base( health, ammo, name )    {  this.brain = brain;     } 



new public void Passport() { 

           Console.WriteLine( "Daemon {0} \t health ={1} ammo ={2} brain ={3}",  



Name, Health, Ammo, brain ); 

        } 

     public void Think() 

          {  Console.Write( Name + " is" ); 

            for ( int i = 0; i < brain; ++i ) 

                  Console.Write( " thinking" ); 

            Console.WriteLine( "..." ); 

          } 



int brain;        // жабық өріс 

public void Passport()           // 



тәсіл 

     {    

Console.WriteLine(  

          "Monster {0} \t health = {1} \ 

          ammo = {2}",  

           name, health, ammo ); 

      } 

 

Өрістер мен тәсілдерді мұралау 

 



Кластың өрістері, тәсілдері және қасиеттері мұраланады. 

 



Базалық класс элементін жаңа элементке алмастыру қажет болғанда new 

түйінді сөзін қолданған жөн: 

// Daemon класының тәсілдері (тегінің функцияларын толықтыру) 

new public void Passport()  

base



.Passport();     // ата-тегінің функцияларын қолдану 

       


Console.WriteLine( brain );         // толықтыру 



 



// Daemon класының тәсілі (толық алмастыру) 

new public void Passport() { 

           Console.WriteLine( "Daemon {0} \t health ={1} ammo ={2} brain ={3}",  

50 

 

Name, Health, Ammo, brain ); 



        } 

 

// Monster класының тәсілі 

public void Passport() 

     {    

      Console.WriteLine(  

          "Monster {0} \t health = {1} \ 

          ammo = {2}",  

name, health, ammo ); 

      } 

 

Виртуалды тәсілдерді қолдану 

 

 



Виртуалды  тәсілдер  туынды  кластармен  базалық  класқа  сілтеме  жасау  арқылы 

жұмыс істегенде қолданылады.  

 

Сонымен қатар, объектілерді тәсілдерге параметр ретінде беру кезінде виртуалды 



тәсілдер  қолданылады.  Тәсілдің  параметрлерінде  базалық  типті  объект  сипатталады,  ал 

шақыру  кезінде  оған  туынды  класс  объектісі  беріледі.  Бұл  жағдайда  тәсілдің  ішіндегі 

объект  үшін  шақырылатын  виртуалды  тәсілдер  параметрдің  емес,  аргументтің  типіне 

сәйкес болады.  

 

Кластарды сипаттау кезінде виртуалды тәсілдер ретінде туынды кластарда басқа 



жолмен  орындалатын  тәсілдерді  анықтау  ұсынылады.  Егер  иерархияның  барлық 

кластарында тәсіл бірыңғай жүзеге асатын болса, оны жай тәсіл ретінде анықтаған жөн. 




Достарыңызбен бөлісу:
1   2   3   4   5   6   7   8   9   10   11




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет