Програмни интерфейси, ръководства и примери

Глава 3. Пакети и интерфейси

интерфейси

Може би сте забелязали, че можете да получите едно от тях от само един клас, всеки клас или получени от семейства с един родител, както е показано на фиг. 3.4, както и. Всички класове се провеждат само на "Адам" на обекта на класа. Но често има нужда да се генерира клас на два класа на обесване, както е показано на фиг. 3.4 б. Това се нарича множествено наследяване (множествено наследяване). В множествено наследяване, няма нищо лошо. Трудности възникнат, ако класовете са генерирани от самите висящи от един клас А, както е показано на фиг. 3,4 * инча Този така наречен "диамант с форма на" наследяване.







Фиг. 3.4. Различни версии на наследството

В действителност, дори и в клас се определя метод А е (), към който се откажем от определен клас метод за. Можем ли да бъдем сигурни, че методът на е, изпълнява това, което е написано в клас А, т.е.. Д. Метод на A.f? Може би той бе отменено в класове В и С? Ако е така, това, което ние използваме опцията: B.f () или c.f ()? Разбира се, можете да идентифицирате случаи на класове и методи за достъп на тези случаи, но това е съвсем друг въпрос.

С други езици за програмиране, този проблем е решен по различен начин, главно се посочва името на фута на метод). Но тя винаги е принцип KISS счупен. Около множествено наследяване е винаги много противоречия, има своите пламенни поддръжници и еднакво ревностните противници. Ние няма да се меси в споровете на нашия бизнес - най-доброто използване на езика означава за решаване на техните проблеми.

Създателите на езика Java, след много дебати и разсъждения, получил радикален - забранени множествено наследяване на всички. Когато разширението на класа след думата се простира можете да напишете само едно име от суперкласа. Със супер усъвършенстване може да се прилага само за членове на непосредствена суперкласа.

Но какво, ако все още е необходимо да се използват няколко предци в поколението? Например, имаме общ Автомобилна Car клас. от която можете да генерирате камион камион класа и класа на лек автомобил Sag. Но тук е необходимо да се опише пикап Pickup. Този клас трябва да наследи свойствата и камиони, както и автомобили.

В такива случаи се използва друг език изгради Java- интерфейс. Внимателно анализиране установи, че проблемът се създава само прилагане на методи, а не техните описания множество наследство ООП теоретици.

Интерфейс (интерфейс), за разлика от класа съдържа само константи и методи заглавия, без тяхната реализация.

Интерфейси са поставени в едни и същи пакети и в опаковката, като класове, както и събрани в един и същи клас-файлове.

описание на интерфейса започва с думата интерфейс. който може да бъде предшествано обществен модификатор. което означава, че, както и за този клас, че интерфейсът е достъпно навсякъде. Ако модификатора не е публичен, интерфейсът ще се вижда в своя пакет само.







След думата интерфейс е написано името на интерфейса. След това може да се; стои думата и разширява списъка с предците на интерфейсите със запетаи. По този начин, интерфейси могат да бъдат генерирани от интерфейсите да образуват самостоятелно, независимо от класа, йерархия, и може да има множество наследство на интерфейси. В тази йерархия, без корен, общ прародител.

След това, тези скоби са написани в произволен ред и постоянни методи за заглавия. Можем да кажем, че в интерфейса всички методи са абстрактни, но думата резюмето не е необходимо да се напише. Константи винаги са статични, но това не е необходимо да се уточни статично ключовата дума и финала.

Всички константи и методи в интерфейси са винаги отворени, дори не .ukazyvat модификатор публично.

Ето как може да се предложи схемата за превозни средства йерархия:

интерфейс Car простира Automobile

интерфейс камион простира Automobile

интерфейс Pickup простира автомобил, камион

По този начин, на интерфейса - това е просто една скица, скица. В него се посочва какво да правя, но не определя как да го направя.

Как да се използва един и същ интерфейс, ако той е напълно абстрактно, няма пълен метод?

Да не се използва интерфейс и неговото прилагане (изпълнение). Въвеждането на интерфейс - един клас, в който са боядисани техниките на един или повече интерфейси. В заглавната част на класа, след като името му или след името на своя суперкласа, ако има такива, писаното слово и оръдия, разделени със запетаи, изброява имената на интерфейсите.

Ето как можете да реализирате йерархия на превозните средства:

интерфейс за кола се простира на автомобили.>

клас камион изпълнява Автомобилна.>

клас Pickup простира камион изпълнява кола

интерфейс Car простира Automobile

интерфейс камион простира Automobile

клас Pickup изпълнява автомобил, камион

Изпълнението на интерфейса може да е непълен, някои методи на интерфейса са боядисани, а други - не. Това осъзнаване - абстрактен клас, то определено трябва да отбележат модификатор абстрактно.

Как да се прилагат в класна стая метод пикап F на (). описан в интерфейса на саги и камион интерфейс със същия подпис? Отговорът е прост - нищо. Тази ситуация не може да се реализира в класа на Pickup. Необходимо е да се изработи програма по различен начин.

По този начин, интерфейсът ви позволи да се приложат в Java чист обектно-ориентиран дизайн, който се фокусира върху въпроси от изпълнението на проекта.

Можем да започнем изготвянето, напишете го под формата на йерархия на интерфейси, без да мисля за изпълнението, а след това се гради върху този проект клас йерархия, като се имат предвид ограниченията на единичен наследство и видимостта на членовете на групата.

Обява 3.3 показва как можете да се съберат с помощта на интерфейса домашни любимци хор в Обява 2.2.

Обявата 3.3. С помощта на интерфейса за полиморфизъм организация

клас Dog изпълнява Voice

обществени невалидни глас ()

публично статично невалидни основни (String [] опцията)

за (междинно съединение к = -0 К <10; k++)

При Lights.RED: System.out.println ( "Спри!"); прекъсване;

При Lights.YELLOW: System.out.println ( "Чакай!"); прекъсване;

При Lights.GREEN: System.out.println ( "Давай!"); прекъсване;

При Lights.ERROR: System.err.println ( "Време за грешка"); прекъсване;

по подразбиране: System.err.println ( "Unknown светлина."); се върне;

Тук, в интерфейса на светлините. константите общи за целия проект.

Класът Timer реализира този интерфейс и използва константи директно като свои собствени. промяна на този метод смяна на класа доставя сигнали с различна светлина забавяне на трафика в зависимост от цвета. Тема клас изпълнява сън () метод закъснение от стандартната библиотека, която се предава време на забавяне в милисекунди. Този метод изисква изключение боравене пробвам<> улова () <>. от които ние трябва да се говори в глава 16.

TrafficReguiator клас не изпълнява интерфейса Светлини и използва пълните имена Lights.RED т.н. Това е възможно, тъй като постоянно червено, жълто и зелено са статични по подразбиране.

Сега вече знаем всичко на езика Java означава да се изработи решение на проблема. В заключение на разговора за проектиране, да не говорим за постоянно нарастващата колекция от дизайнерски модели (шаблони за дизайн).