Интерфейстің пайдасына бір мысал...

Бағдарламалау
Интерфейс дегеніміз не? Оның пайдасы қаншалықты? деген сұрақ төңірегінде жүрген достарыма айтар бір қызығым бар ;)
Біреулер үшін жаңалық емес те шығар, бірақ өзім енді байқағасын қызық көріп бөлісіп отырмын, мүмкін біреулерге пайдасы тиіп те қалар деп.
Әуелі не істейтінімізді айтамын, сосын не ұтқанымызды:
1) класс СlassA құрамыз.
2) класс ClassB құрамыз.
3) interfase ISandar құрамыз, оның ішінде int Method(); болуы керек мысалға.
4) ClassA,ClassB-ларға ISandar-ды мирас етіп табыстаймыз))
class ClassA:ISandar
class ClassB : ISandar

5) Енді, ережеге сәйкес, әр класс ішінде еншіленген интерфейстің методын ең қарапайым түрде жүзеге асырамыз:
ClassA-ның Методы 1(оң сан), ал ClassB-ның методы -1(теріс сан) қайтара салсын. Дәл қазірге күрделіліктің еш қажеті жоқ.
6) class Program-da static void OnTerisinAniktau() деген метод құрамыз, оның қабылдайтын параметріне ISandar-ды береміз, ал денесінде сол интерфейстің Методы қайтарған санның оң не теріс екенін анықтайтын логика құру керек.
7) static void Main(strg [] args) методында өзіміз құрған класстардың объектілерін құрамыз(a1,b1).
8) OnTerisinAniktau(Isandar i) методын әр класстың объектілеріне жеке-жеке арнап екі рет шақырамыз.

/*Параметріне a1 берсек те, b1 берсек те қате деп танылмайды. Себебі, бұлардың класстары метод параметріне берілген ISandar интерфейсін өзіне көшіріп алған(«Наследование» тақырыбы).*/
9)Әдеттегідей, Console.ReadKey()-ді қоюды ұмытып кетпеңіз ;)
Бәрін дұрыс істесеңіз төмендегідей нәтиже шығуы тиіс:
namespace ConsoleCHERNOVIK
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a1 = new ClassA();
            ClassB b1 = new ClassB();
            OnTerisinAniktau(a1);
            OnTerisinAniktau(b1);
            Console.ReadKey();
        }
        static void OnTerisinAniktau(ISandar i)
        {
            if (i.Method() >= 0)
                Console.WriteLine("On san");
            else
                Console.WriteLine("Teris san");
        }
        
    }
    class ClassA:ISandar
    {
        public int Method()
        {
            return 1;
        }
    }
    class ClassB : ISandar
    {

        public int Method()
        {
            return -1;
        }
    }
    interface ISandar
    {
        int Method();
    }
}

Бағдарламамызды қосып бәрі дұрыс екеніне көз жеткізейік:
interface
Енді, әрі-бері шұқылап, тексеріп көрейік:
1)Екі классты да интерфейсті жүзеге асырмай-ақ өз бетінше int Method( ) { } құрған қылайық. Ол үшін класстардағы :ISandar деген жерлерді өшіре салсақ жеткілікті.
Студио мынадай қателерді шығарады:interface
Мәселе, static void OnTerisinAniktau(ISandar) { } методының параметрі мен оны шақыру барысында ұсынып отырған аргументтеріміздің бір типте еместігінде:interface
2) Оны да өзгертеміз: ISandar емес ClassA қылайық әуелі. Метод денесінде еш қате шықпайды.
Бірақ, бұл да жеткіліксіз: ClassB дала қалып тұр :(
interface
3) Параметріне ClassA берсек, ClassB далада қалады, ClassB берсек ClassA-дан айырыламыз. Амал жоқ методтың «перегрузкасын»(осы сөзге де қазақша баламасын ұсыныңыздаршы) құрамыз.
4)Бәрі дұрыс сияқты. Енді біздің бағдарламамызда интерфейс еш жерде қолданылмайды.
Ақыры, «жеңіске жеткенсініп» interface ISandardi толықтай жойып жіберсек те болады.
Бәрі дұрыс болса, нәтижесі мынадай болуы тиіс:
namespace ConsoleCHERNOVIK
{
    class Program
    {
        static void Main(string[] args)
        {
            ClassA a1 = new ClassA();
            ClassB b1 = new ClassB();
            OnTerisinAniktau(a1);
            OnTerisinAniktau(b1);
            Console.ReadKey();
        }
        static void OnTerisinAniktau(ClassA i)//parametrin ozgerttik  ISandar >>>>> ClassA
        {
            if (i.Method() >= 0)
                Console.WriteLine("On san");
            else
                Console.WriteLine("Teris san");
        }
        static void OnTerisinAniktau(ClassB i)//peregruzka kurildi
        {
            if (i.Method() >= 0)
                Console.WriteLine("On san");
            else
                Console.WriteLine("Teris san");
        }

    }
    class ClassA
    {
        public int Method()
        {
            return 1;
        }
    }
    class ClassB
    {

        public int Method()
        {
            return -1;
        }
    }//interface kerek bolmai kalgandiktan - owire saldim
}

Ал енді сұрақ: біз бұл жерде екі-ақ класспен жұмыс жасап тұрмыз, ал егер де жиырма класс болса ше? Мүмкін, тіпті жүз класс делік. Әр қайсысына жеке метод құру керек болады ғой. Ал бұл дегеніміз осы методпен жұмыс істейтін класстар саны қанша есе артса сонша есе артық жұмыс істейміз деген сөз. Қайсысы оңай, интерфейс қолданған ба әлде ...?

Қорытындыға:
Жұмысың қаптап, долдансаң,
Досым-ау, саған керегі
Интерфейс дұрыс қолдансаң
Көп нәрсе шешілед, дер едім ;)

Соңына дейін табандылық танытып оқып шыққандарға әр қайсысына бір-бір раҚметтен)) Нақты осы мысалға қатысты не айтылуы керек, бәрін айттым деп ойлаймын. Ұқпай қалған жерлеріңіз болса, қайталап оқып көріңіздер.

5 пікір

avatar
Interface-тың параметр ретінде беруге болатынын білмейді екем. Жаңалық болды, автор рахмет.
avatar
static void OnTerisinAniktau(ClassB i) деген методтын орнына
static void OnTerisinAniktau(ISandar i) деп жазганда дурыс болатын. Сонда перегрузка жасау кажет
Просто кластын экземплярын жасаганда осылай жасау керек болатын.

ISandar a1 = new ClassA();
ISandar b1 = new ClassB();
OnTerisinAniktau(a1);
OnTerisinAniktau(b1);

Сонда натиже бурынгыдай болады.
avatar
Осы пікіріңізді толықтырып жазасыз ба, ештеңе таба алмай тұрмын.
Жазбадағы бірінші мысал — дұрысы(интерфейсті), ал екінші мысалы (интерфейссіз) артық жұмыстың көп болатынын көрсету үшін құрылған мысал.
avatar
Аааа сорри, брат, сиздин жазганыныз дурус. Мен тугел окымай перегрузканы корип жаза салганын. Перегрузка жасамауга болушы еди деп ).
avatar
aaaa...base)
ewkim estimesin)))

+ 1 baikamai basip koippin sizge,koimadim dep eseptersiz ;)
Тек қана тіркелген және авторизациядан өткен қолданушылар пікір қалдыра алады.