Интерфейс әдістері


Мазмұны

  1. Кіріспе . . . 3
  2. Интерфейстер . . . 4
  3. Түрі өзгертілген интерфейстер . . . 8
  4. Жалпылама интерфейстер . . . 8
  5. Интерфейстің айқын қолданылуы . . . 10
  6. Компараторды пайдалану . . . 17
  7. Қорытынды . . . 22
  8. Пайдаланылған әдебиеттер . . . 23

Кіріспе

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

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

Интерфейстің мұрагерлігін қолдану, тек қандай да бір интерфейсті кеңейтіп, кодын бұзбау үшін қолдану пайдалы болуы мүмкін.

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

Мұрагерлікті пайдалана отырып біз мұрагерлік - класстардың базалық класстын жалпы функционалын толықтырыуға немесе анықтауға болады. Алайда, біз тек бір классты тікелей мұрагерлік ете аламыз, ал С++ мұрагерліктін бірнешеуін қосуға болады.

C#-та мұндай проблеманы шешуде интерфейстер көмектеседі. Олар ОББ - да үлкен рөльді ойнайды. Интерфейстер нақты іс әрекеті жоқ функционалды анықтай алады. Содан кейін бұл функционал классты құрастырып, интефейстің деректерін қолданады.

Интерфейсті анықтау үшін interface кілттік сөз қолданылады. C#-тың ережелері бойынша интерфейс аттары бас әріптен басталады. Мыслы: IComparable, IEnumerable, бірақ бұл міндетті талап емес, ол бағдарламалаудың стилі сияқты. Интерфейстер класстар сияқты қасиеттерді, әдістерді, оқиғаларды қолданады, бірақ нақты істін асырылуы болмауы мүмкін.

Келесі Iaccount интерфейсін анықтайық. Ол әдіс пен ерекшелікті клиентті санау үшін қолданады. Интерфейсті қосу үшін проект үстіне тышқанның оң батырмасын басып менюде Add-> New Item таңдап, Interface компонентін таңдау керек.

Келесі Iaccount интерфейстің кодын өзгертейік:

interface IAccount

{

// Текущая сумма на счету

int CurrentSum { get; }

// Положить деньги на счет

void Put(int sum) ;

// Взять со счета

void Withdraw(int sum) ;

// Процент начислений

int Percentage { get; }

}

Интерфейстерде әдіс пен ерекшелік істін жүзеге асырылуы жоқ, сондықтан ол абстрактілі әдіспен және абстрактілі класпен ұқсас болады. Осы интерфейстін мақсаты: ол екі шотында ақша ағымдағы сомасы қасиеттері мен депозиттер бойынша пайыздық ставкаларды айқындайды, және есеп-шотына ақша қосу үшін мен ақша алуға екі әдістер орындалады.

Интерфестін тағы бір ерекшелігі: барлық оның мүшелері - әдістер және қасиеттері рұқсат модификаторлары болмайды, бірақ стандарт бойынша public модификаторы болады. Өйткені интерфейстің мақсаты функционалды, класстармен байланыстыру. Сондықтан барлық функционалдар ашық болу керек.

Интерфейсті қолдану класстарға ұқсас:

class Client : IAccount

{

// реализация методов и свойств интерфейса

}

Енді Client классында интерфейсті орнатайық, өйткені клиентте шот бар:

class Client : IAccount

{

int _sum; // Переменная для хранения суммы

int _percentage; // Переменная для хранения процента

public string Name { get; set; }

public Client(string name, int sum, int percentage)

{

Name = name;

_sum = sum;

_percentage = percentage;

}

public int CurrentSum

{

get { return _sum; }

}

public void Put(int sum)

{

_sum += sum;

}

public void Withdraw(int sum)

{

if (sum <= _sum)

{

_sum -= sum;

}

}

public int Percentage

{

get { return _percentage; }

}

public void Display()

{

Console. WriteLine("Клиент " + Name + " имеет счет на сумму " + _sum) ;

}

}

Абстрактілі класстын абстрактілі әдістері тәріздес Client классы интерфейстің барлық әдістерін орындайды. Бұл жағдайда, интерфейстің барлық әдістері мен қасиеттері public болғандықтан, бұл әдіс пен қасиетті класста орныдағанда public модификаторын қолдану керек. Сондықтан егер класс әдісі protected модификаторын қолданса, онда интерфейске бұл модификатор жарамайды.

Бағдарламада класстың мысалы:

Client client = new Client("Tom", 200, 10) ;

client. Put(30) ;

Console. WriteLine(client. CurrentSum) ; //230

client. Withdraw(100) ;

Console. WriteLine(client. CurrentSum) ; //130

Интерфейстер класс тәрізді мұрагерлікті қолдана алады:

interface IDepositAccount : IAccount

{

void GetIncome() ; // начисление процентов

}

Бұл интерфейсті қолданғанда Client классы IDepositAccount интерфейстің әдісі мен қасиеті тәрізді орындалу керек. Себебі әдіс пен қасиет IAccount интерфейстің бөлігі.

Түрі өзгертілген интерфейстер

Түрлердің өзгертулері туралы айтылған бәрі интефейстерге де тән. Өйткені класс Client, IАccount интерфейсті орындауын қосады, онда IAccount типтегі айнымалы Client типтегі объектіге сілтемені сақтай алады.

IAccount client1 = new Client("Том", 200, 10) ;

client1. Put(200) ;

Console. WriteLine(client1. CurrentSum) ; // 400

// Интерфейс не имеет метода Display, необходимо явное приведение

((Client) client1) . Display() ;

Егер біз Client класстың әдістере байланысқымыз келсе, ал олар IAccount интерфесте анықталмаған болса, онда бізге оларды түрлерін өзгертуге тура келеді: ((Client) client1) . Display() ;

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

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

class Client<T> : IAccount<T>

{

T sum=default(T) ;

public void SetSum(T _sum)

{

this. sum = _sum;

}

public void Display()

{

Console. WriteLine(sum) ;

}

}

IAccount интерфейсі Т типімен типтелген, ол тип интерфейс орындалуы қосылғанда Client классында қолданылады. Негізінен қосындының айнмалысы Т сияқты анықталған, ол арқылы қосында айнымалысы санның әртүрлі типтерін қоса алады.

Екі орындалуды қарастырайық: біріншінің параметір типі - int, ал екіншісі double типін пайдаланады:

IAccount<int> intClient = new Client<int>() ;

intClient. SetSum(300) ;

intClient. Display() ;

IAccount<double> doubleClient = new Client<double>() ;

doubleClient. SetSum(500. 09) ;

doubleClient. Display() ;

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

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

Мысалы:

class Person : ISchool, IUniversity

{

public void Study()

{

Console. WriteLine("Учеба в школе или в университете") ;

}

}

interface ISchool

{

void Study() ;

}

interface IUniversity

{

void Study() ;

}

Person классы, Study() әдісті анықтайды. Екі қолданылған интерфейс үшін, бір ортақ орындалуды құрайды. Person объектіні ISchool немесе IUniversity типтегі объект ретінде қарастырмасада, әдістін мәні бір болады.

Алайда, орындалатын интерфейсті кейде ажыратуға тиіс. Бұл жағдайда интерфейсті қолдану қажет:

class Person : ISchool, IUniversity

{

void ISchool. Study()

{

Console. WriteLine("Учеба в школе") ;

}

void IUniversity. Study()

{

Console. WriteLine("Учеба в университете") ;

}

}

Айқын қолдану кезінде интерфейс пен әдіс аттары көрсетілуі тиіс, бұл жағдайда біз public модификатроды қолдана алмаймыз, ол дегеніміз әдістеріміз жабық болады. Бұл жағдайда Study әдісті қолданғанда, Person объектісін қажет түрге түрлендіру қажет:

static void Main(string[] args)

{

Person p = new Person() ;

((ISchool) p) . Study() ;

((IUniversity) p) . Study() ;

Console. Read() ;

}

Класстар сілтемелік түр болғандықтан, оларда кейбір шектеулер болады. Атап айтқанда:

class Program

{

static void Main(string[] args)

{

Person p1 = new Person { Name="Tom", Age = 23 };

Person p2 = p1;

p2. Name = "Alice";

Console. WriteLine(p1. Name) ; // Alice

Console. Read() ;

}

}

class Person

{

public string Name { get; set; }

public int Age { get; set; }

}

Бұл жағдайда р1 және р2 объектілері жадыдағы бір объектіге сілтенеді. Сондықтан р2 айнымалының өзгеруі р1-ге де әсер етеді.

Р2 айнымалымыз жаңа объектіге, бірақ р1 мәніне тең болып, сілтену үшін біз оны клондаймыз. Ол үшін интерфейс ICloneable қолданады:

public interface ICloneable

{

object Clone() ;

}

Person классындағы интерфейстін орындалуы келесідегідей болуы мүмкін:

class Person : Icloneable

{

public string Name { get; set; }

public int Age { get; set; }

public object Clone()

{

return new Person { Name = this. Name, Age = this. Age };

}

}

Қолданылуы:

class Program

{

static void Main(string[] args)

{

Person p1 = new Person { Name="Tom", Age = 23 };

Person p2 = (Person) p1. Clone() ;

p2. Name = "Alice";

Console. WriteLine(p1. Name) ; // Tom

Console. Read() ;

}

}

Енді бәрі жақсы көшіріледі де, р2-нің өзгерістері р1-ге әсер етпейді.

Көшіру кодын қысқарту үшін, арнайы әдісті қолданайық MemberwiseClone(), ол объектінің көшірмесін қайтарады:

class Person : ICloneable

{

public string Name { get; set; }

public int Age { get; set; }

public object Clone()

{

return this. MemberwiseClone() ;

}

}

Бұл әдіс беттік (терең емес) көшіруді орындайды. Алайда, бұл көшірме жеткіліксіз болуы мүмкін. Мысалы: Person классы Company объектісінің сілтемесі бар болсын:

class Person : ICloneable

{

public string Name { get; set; }

public int Age { get; set; }

public Company Work { get; set; }

public object Clone()

{

return this. MemberwiseClone() ;

}

}

class Company

{

public string Name { get; set; }

}

Бұл жағдайда, көшіру кезінде, жаңа көшірілім сол Company объетіге сілттеп тұрады:

Person p1 = new Person { Name="Tom", Age = 23, Work= new Company { Name = "Microsoft" } };

Person p2 = (Person) p1. Clone() ;

p2. Work. Name = "Google";

p2. Name = "Alice";

Console. WriteLine(p1. Name) ; // Tom

Console. WriteLine(p1. Work. Name) ; // Google - а должно быть Microsoft

Беттік көшіру қиын объектілерде орындалмайды, ол тек қарапайым типтегі қасиеттерге орындалады. Бұл жағдайда да «терең» көшіруді талап етеді:

class Person : ICloneable

{

public string Name { get; set; }

public int Age { get; set; }

public Company Work { get; set; }

public object Clone()

{

Company company = new Company { Name = this. Work. Name };

return new Person

{

Name = this. Name,

Age = this. Age,

Work = company

};

}

}

class Company

{

public string Name { get; set; }

}

Көбінесе . NET-қа орнатылған коллекция мен массив класстары сұрыптауды қолдана алады. Sort() аты әдіс арқылы, барлық деректер жиынын сұрыптауға болады. Мысалы:

int[] numbers = new int[] { 97, 45, 32, 65, 83, 23, 15 };

Array. Sort(numbers) ;

foreach (int n in numbers)

Console. WriteLine(n) ;

Алайда, Sort әдісі әдепкі бойынша тек түрлері int немесе string болатын айнымалылармен орындалады. Ал күрделі объектілер үшін IComparable интерфейс қолданылады. Ол тек бір әдісті қолданады:

public interface IComparable

{

int CompareTo(object o) ;

}

CompareTo әдісі ағымдағы объектіні object o параметірімен берілген объектіні салыстырады. Соңында жауабы нақты сан болады, ол үш түрлі мән болуы мүмкін:

  • Нөлден төмен. Демек, ағымдағы объект, берілген объект алдында болуы керек;
  • Нөлге тең. Екі объект тең;
  • Нөлден үлкен. Демек, ағымдағы объект, берілген объект артында болуы керек;

Мысалы:

class Person : IComparable

{

public string Name { get; set; }

public int Age { get; set; }

public int CompareTo(object o)

{

Person p = o as Person;

if (p != null)

return this. Name. CompareTo(p. Name) ;

else

throw new Exception("Невозможно сравнить два объекта") ;

}

}

Мұнда салыстыру нысаны ретинде Person объетінің Name қасиеті алынды. Сондықтан, бұл жерде салыстыру екі объектінің Name қасиеттерінің құрамымен. Егер объетіні Person түрге келтірілмесе, онда ерекше жағдай болады.

Мысалы:

Person p1 = new Person { Name = "Bill", Age = 34 };

Person p2 = new Person { Name = "Tom", Age = 23 };

Person p3 = new Person { Name = "Alice", Age = 21 };

Person[] people = new Person[] { p1, p2, p3 };

Array. Sort(people) ;

foreach(Person p in people)

{

Console. WriteLine("{0} - {1}", p. Name, p. Age) ;

}

IComparable интерфейсі жалпылама нұсқасы болады, сондықтан біз Person классында оны пайдалануын оңайлатып немесе қысқарта аламыз:

class Person : IComparable<Person>

{

public string Name { get; set; }

public int Age { get; set; }

public int CompareTo(Person p)

{

return this. Name. CompareTo(p. Name) ;

}

}

Компараторды пайдалану

IComparable интерфейсінен басқа . NET IComparer интерфейсті ұсынады:

interface IComparer

{

int Compare(object o1, object o2) ;

}

Compare әдісі екі о1 және о2 объектілерді салыстыруға арналған. Ол сондай-ақ жауабы ретінде үш түрлі нәтиже шығарады. Егер бірінші объект екіншісінен үлкен болсан онда 0-ден үлкен сан шығады, егер кіші болса 0-ден кем, ал бірдей болса онда 0-ді қайтарады.

Person объектінің компараторын құрастырайық. Name қасиеттерінің жол ұзындығын салыстырсын:

class PeopleComparer : IComparer<Person>

{

public int Compare(Person p1, Person p2)

{

if (p1. Name. Length > p2. Name. Length)

return 1;

else if (p1. Name. Length < p2. Name. Length)

return -1;

else

return 0;

}

}

Бұл жағдайда Icomparer интерфейстің жалпылама түрі қолданылады, қажетсіз түр өзгертулерді пайдаланбау үшін. Компараторды пайдалану:

Person p1 = new Person { Name = "Bill", Age = 34 };

Person p2 = new Person { Name = "Tom", Age = 23 };

Person p3 = new Person { Name = "Alice", Age = 21 };

Person[] people = new Person[] { p1, p2, p3 };

Array. Sort(people, new PeopleComparer() ) ;

foreach(Person p in people)

{

Console. WriteLine("{0} - {1}", p. Name, p. Age) ;

}

Компаратор объектісі Array. Sort() әдісінің екінші параметр ретінде беріледі. Бұл жерде Person классы IComparable интерфейсін қосама жоқ па маңызы жоқ. Компаратормен сұрыптаудын ережелері, жоғары басымдылыққа ие болады. Басында Person объектілерінің аттары қысқалары бірінші, ал соңында аттары ұзын:

Tom - 23

Bill - 34

Alice - 21

Ковариантылық және контравриантылық ұғымдары бағдарламадада бір типтін орнына басқа иерархияның төменгі немесе жоғары орналасқан типті пайдалана алады.

... жалғасы

Сіз бұл жұмысты біздің қосымшамыз арқылы толығымен тегін көре аласыз.
Ұқсас жұмыстар
Интерфейстер, олардың сипатталуы және жүзеге асуы. Қабықша кластар
Басқару жүйелерінің интерфейстерін дамыту
Компьютердің ішкі интерфейстері
АДАМ МЕН МАШИНАНЫҢ ӨЗАРА ӘРЕКЕТТЕСТІГІ
C# Тілінің негіздері
Оқиғаларды өңдеу
Visual basic ортасының графикалық мүмкіндіктерін зерттеу, қоңыраулы сағат құру
Криптография туралы мәліметтер
Объектіге бағытталған Java бағдарламалау
Delphi COM технологиялары
Пәндер



Реферат Курстық жұмыс Диплом Материал Диссертация Практика Презентация Сабақ жоспары Мақал-мәтелдер 1‑10 бет 11‑20 бет 21‑30 бет 31‑60 бет 61+ бет Негізгі Бет саны Қосымша Іздеу Ештеңе табылмады :( Соңғы қаралған жұмыстар Қаралған жұмыстар табылмады Тапсырыс Антиплагиат Қаралған жұмыстар kz