Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Объектіге бағытталған бағдарламалауда (ООП) ішкі сынып немесе ұясы бар сынып – басқа сыныптың немесе интерфейстің ішінде толығымен жарияланған сынып. Ол басқаша сыныптан (төменгі сыныптан) ерекшеленеді.
In object oriented programming (OOP), an inner class or nested class is a class declared entirely within the body of another class or interface. It is distinguished from a subclass.
Шолу
Нормалды немесе жоғарғы деңгейдегі сыныптың мысалы өздігінен болуы мүмкін. Керісінше, ішкі сыныптың мысалын жоғарғы деңгейлі сыныпқа байланыстырмай жасауға болмайды. Алайық, төрт дөңгелегі бар автомобиль ұғымын. Біздің дөңгелектеріміздің ерекшелігі – олар автомобильдің құрамына кіреді. Бұл ұғым дөңгелектерді кез келген көлік құралының бөлігі бола алатын, жалпы түрінде көрсетпейді. Керісінше, оларды автомобильге тән деп көрсетеді. Осы ұғымды ішкі сыныптарды пайдаланып былай модельдеуге болады:
An instance of a normal or top level class can exist on its own. By contrast, an instance of an inner class cannot be instantiated without being bound to a top level class. Let us take the abstract notion of a Car with four Wheels. Our Wheels have a specific feature that relies on being part of our Car. This notion does not represent the Wheels as Wheels in a more general form that could be part of any vehicle. Instead, it represents them as specific to a Car. We can model this notion using inner classes as follows:
Бізде жоғарғы деңгейлі Автомобиль сыныбы бар. Автомобиль сыныбының мысалдары Дөңгелек сыныбының төрт мысалынан тұрады. Дөңгелектің осы нақты іске асырылуы автомобильге тән, сондықтан код дөңгелектің жалпы түсінігін модельдемейді, ол жоғарғы деңгейлі сынып ретінде жақсырақ көрсетілер еді. Сондықтан ол семантикалық тұрғыдан Автомобиль сыныбымен байланысты және Дөңгелек кодын сыртқы сыныбымен байланыстырады, ол автомобильдің құрамдас бөлігі болып табылады. Белгілі бір автомобильдің дөңгелегі сол автомобильге тән, бірақ жалпылау үшін дөңгелек автомобильдің жиынтық бөлігі болып табылады. Ішкі сыныптар осы байланысты дәл модельдеуге мүмкіндік береді. Біздің Дөңгелек сыныбымызды Автомобиль.Дөңгелек деп атауға болады, Автомобиль – жоғарғы деңгейлі сынып, ал Дөңгелек – ішкі сынып. Сондықтан ішкі сыныптар бағдарламаның әлдеқандай бөліктерін объектілік бағытта модельдеуге мүмкіндік береді, әйтпесе олар сыныпқа енгізілмейтін еді. Сыныптың ішіндегі үлкен код сегменттерін ішкі сыныптың орнына бөлек жоғарғы деңгейлі сынып ретінде модельдеу немесе қайта құру оңайырақ болуы мүмкін. Бұл кодты қолдануда жалпылауға және қайта пайдалануға мүмкіндік береді, бірақ бұл ерте жалпылау болуы мүмкін. Егер кодта ортақ функционалдылығы бар көптеген ішкі сыныптар болса, бұл тиімдірек болуы мүмкін.
We have the top level class Car. Instances of class Car are composed of four instances of the class Wheel. This particular implementation of Wheel is specific to a car, so the code does not model the general notion of a wheel that would be better represented as a top level class. Therefore, it is semantically connected to the class Car and the code of Wheel is in some way coupled to its outer class, being a composition unit of a car. The wheel for a particular car is unique to that car, but for generalization, the wheel is an aggregation unit to the car. Inner classes provide a mechanism to accurately model this connection. We can refer to our Wheel class as Car. Wheel, Car being the top level class and Wheel being the inner class. Inner classes therefore allow for the object orientation of certain parts of the program that would otherwise not be encapsulated into a class. Larger segments of code within a class might be better modeled or refactored as a separate top level class, rather than an inner class. This would make the code more general in its application and therefore more re usable but potentially might be premature generalization. This may prove more effective, if code has many inner classes with the shared functionality.
Бағдарламалау тілдері
Ішкі кластар Java бағдарламалау тілінің 1.1 нұсқасынан бастап қолданысқа енді. Ұялатылған кластар D бағдарламалау тілінің, Visual Basic NET, Ruby, C++ және C# тілдерінде де бар. Python-да класты басқа кластың, әдістің немесе функцияның ішінде ұялатуға болады. C++ тілінде Java-ның статикалық мүше кластарына ұқсас ұялатылған кластар бар, бірақ олар "static" деп жарияланбайды. BETA тілі ұялатылған кластар тұжырымын алғаш рет енгізді.
Inner classes became a feature of the Java programming language starting with version 1.1. Nested classes are also a feature of the D programming language, Visual Basic NET, Ruby, C++ and C#. In Python, it is possible to nest a class within another class, method or function. C++ has nested classes that are like Java's static member classes, except that they are not declared with "static". BETA language introduced this notion of nested classes.
GUI коды
Жергілікті ішкі кластар Java-да GUI коды үшін кері шақыруларды анықтау үшін жиі қолданылады. Компоненттер оқиғаларды басқару интерфейсін іске асыратын немесе белгілі бір оқиға туындаған кезде орындалатын кодты қамтитын абстрактілік адаптер класын кеңейтетін объектімен бөлісе алады. Оқиғаларды өңдеу кодын тек бір компонент пайдаланғанда және аталған сілтеме қажет болмағанда анонимді ішкі кластар да қолданылады. Бұл оқиғаның көзін анықтау үшін көптеген if-else тармақтары бар үлкен монолиттік әдістен сақтануға мүмкіндік береді. Мұндай код көбінесе түсініксіз деп есептеледі, ал ішкі кластардың түрлері барлық жағынан жақсырақ деп саналады.
Local inner classes are often used in Java to define callbacks for GUI code. Components can then share an object that implements an event handling interface or extends an abstract adapter class, containing the code to be executed when a given event is triggered. Anonymous inner classes are also used where the event handling code is only used by one component and therefore does not need a named reference. This avoids a large monolithic method with multiple if else branches to identify the source of the event. This type of code is often considered messy and the inner class variations are considered to be better in all regards.