У чым розніца паміж абстрактным класам і інтэрфейсам у OOP?


адказ 1:

Інтэрфейсы - гэта правілы (утрымліваюць толькі дэкларацыі метадаў, а не рэалізацыю). Інтэрфейсы даюць уяўленне пра тое, што рабіць, а не як гэта зрабіць. Таму рэалізацыя цалкам залежыць ад распрацоўніка, выконваючы зададзеныя правілы (г.зн. подпісы метадаў).

Абстрактныя заняткі могуць утрымліваць абстрактныя дэкларацыі, канкрэтныя рэалізацыі альбо абодва. Аднак інтэрфейсы не могуць мець канкрэтных рэалізацый. Абстрактныя дэкларацыі падобныя на правілы, якія неабходна выконваць, а канкрэтныя рэалізацыі падобныя на кіруючыя прынцыпы (вы можаце выкарыстоўваць іх такімі, якімі яны ёсць, альбо вы можаце ігнараваць іх, перапісваючы іх і даючы ўласную рэалізацыю).

Простымі словамі:

Інтэрфейс можа ўтрымліваць толькі дэкларацыі метадаў.

Абстрактны клас можа змяшчаць як дэкларацыі метадаў (абстрактныя метады), так і рэалізацыі метадаў (канкрэтныя метады).

Прыклад інтэрфейсу Java

У цэлым прадметы вызначаюць сваё ўзаемадзеянне з навакольным светам праз метады, якія яны падвяргаюць.

Метады фармуюць інтэрфейс аб'екта з знешнім светам; Напрыклад, кнопкі на пярэдняй частцы тэлевізара - гэта інтэрфейс паміж вамі і электрычнай праводкай з іншага боку пластыкавага корпуса. Націсніце кнопку ўключэння / выключэння, каб уключыць і выключыць тэлевізар.

Інтэрфейс Java вызначае шэраг правілаў (публічныя атрыбуты і метады). Па змаўчанні ўсе метады інтэрфейсу абстрактныя і рэалізуюцца класамі.

Вы можаце выкарыстоўваць інтэрфейс, каб пераканацца, што існуюць пэўныя метады і вярнуць неабходныя тыпы. Калі кампілятар ведае пра гэта, ён можа выкарыстоўваць гэта меркаванне для працы з невядомымі класамі, як быццам бы яны валодаюць нейкім вядомым паводзінамі. Напрыклад, супастаўны інтэрфейс гарантуе, што клас рэалізацыі здольны параўноўваць аналагічны аб'ект () і вярнуць унутр.

Інтэрфейсы, аддзеленыя ад класаў, дазваляюць выразна размяжоўваць інтэрфейс аб'екта і яго рэалізацыю. Без яго ў вас не было б стандартнага спосабу пазначэння таго, што клас наогул не павінен утрымліваць падрабязнасці рэалізацыі.

Па-другое, паколькі Java не падтрымлівае шматразовае ўспадкаванне, інтэрфейсы з'яўляюцца частковым рашэннем, дазваляючы ўспадкаваць знешнія характарыстыкі класа.

Паспрабуйце выкарыстоўваць інтэрфейсы, калі якое-небудзь з гэтых сцвярджэнняў адносіцца да вашай сітуацыі:

  • Вы чакаеце, што для вашага інтэрфейсу будуць звязаныя не звязаныя класы. Напрыклад, супастаўныя і кланаваныя інтэрфейсы рэалізуюцца многімі не звязанымі паміж сабой класамі. Вы хочаце пазначыць паводзіны пэўнага тыпу дадзеных, але ўсё роўна, хто рэалізуе яго паводзіны. Вы хочаце выкарыстоўваць некалькі тыпаў атрымання ў спадчыну.

Інтэрфейсы Java сінтаксічна падобныя на класы. Чакайце зменную інстанцыю і вызначэнне метаду. У інтэрфейсе няма пераменных экзэмпляраў, а метады аб'яўляюцца без цела (толькі азначэнні). Пасля таго, як інтэрфейс вызначаны, любая колькасць класаў можа рэалізаваць інтэрфейс. Каб рэалізаваць інтэрфейс у вашай праграме, клас павінен стварыць поўны набор метадаў, якія вызначаюцца інтэрфейсам. З Java вы можаце ў поўнай меры скарыстацца аспектамі палімарфізму "аднаго інтэрфейсу" і "некалькіх метадаў".

Вызначце інтэрфейс

Імя інтэрфейсу доступу {return type method name1 (спіс параметраў); Метад вяртання тыпу name2 (спіс параметраў); Метад вяртання тыпу nameN (спіс параметраў); Тып канчатковай зменнай = значэнне; }}

Рэалізаваць інтэрфейс

Імя класа класа [пашыраны суперкласс] [рэалізуе інтэрфейс [, інтэрфейс ..]] {цела класа}

Як інтэрфейс узаемадзейнічае з рэальнымі метадамі?

Фактычна рэалізаваны аб'ект выбіраецца ў залежнасці ад тыпу аб'екта. Прыклад у рэжыме рэальнага часу паказаны ў наступным фрагменце кода:

Акаўнт інтэрфейсу {public String getAccountType (); }}

Рэалізацыя №1

public class SavingAccount рэалізуе кошт {public String getAccountType () {return "Захаванне ўліковага запісу"; }}

Рэалізацыя № 2:

грамадскі клас CurrentAccount рэалізуе ўліковы запіс {public String getAccountType () {return "Бягучы рахунак"; }}

Узаемадзеянне з прадметамі

public class TestMain {public static void main (String as []) {Account ram = new SavingAccount (); Уліковы запіс hcl = новы CurrentAccount (); System.out.println (ram.getAccountType ()); // друкуе ашчадны рахунак System.out.println (hcl.getAccountType ()); // друкуе бягучы рахунак}}

Наведайце мае тэсты практыкі сертыфікацыі Java

Тэсты практыкі сертыфікацыі Java


адказ 2:

Дзве вельмі розныя рэчы. Інтэрфейс - кантракт. Гэта дагавор паміж выканаўцам і спажыўцом. Калі клас паказвае, што ён рэалізуе інтэрфейс, карыстальнік класа можа меркаваць, што ён забяспечвае метады, вызначаныя інтэрфейсам (і гэта выконвае кампілятар). Усе класы, якія рэалізуюць інтэрфейс (звязаны альбо не) могуць быць рэдагаваны агульным спосабам. З іншага боку, абстрактны клас - гэта проста клас, у якім некаторыя метады не рэалізуюцца. Вам можа быць цікава пра няпоўны клас. Мэта абстрактнага класа складаецца ў тым, каб аб'яднаць агульныя характарыстыкі некалькіх класаў у адным месцы. Напрыклад, калі вы пісалі перакладчыка, у вас можа быць іншы клас для кожнага вузла ў дрэве выразаў (звярніце ўвагу, што мы выкарыстоўваем інтэрфейс, які дазваляе выклікаць () для ўсіх TreeNodes:

Інтэрфейс TreeNode {int apply (); } нумар грамадскага класа рэалізуе TreeNode {public int apply () {return val; } ...} дадатак публічнага класа рэалізуе TreeNode {public int apply () {return arg1 (). прымяніць () + arg2 (). прымяняць (); } грамадскі TreeNode arg1 () {return arg1val; } грамадскі TreeNode arg2 () {return arg2val; } прыватны TreeNode arg1val; прыватны TreeNode arg2val; ...} публічны клас множанне рэалізуе TreeNode {public int apply () {return arg1 (). прымяніць () * arg2 (). прымяняць (); } грамадскі TreeNode arg1 () {return arg1val; } грамадскі TreeNode arg2 () {return arg2val; } прыватны TreeNode arg1val; прыватны TreeNode arg2val; ...}

У гэты момант вы выявіце, што ўсе вашыя бінарныя аперацыі робяць тое ж самае, каб атрымаць arg1 і arg2. Такім чынам, вы ствараеце базавы клас:

прыватны клас BinaryOperation {public TreeNode arg1 () {return arg1val; } public TreeNode arg2 () {return arg2val; } прыватны TreeNode arg1val; прыватны TreeNode arg2val; }}

Цяпер вы можаце дазволіць BinaryOperation ўспадкаваць усе вашыя бінарныя аперацыі:

дадатак public class пашырае BinarOperation, рэалізуе TreeNode {public int apply () {return arg1 (). прымяніць () + arg2 (). прымяняць (); } ...} Памножанае множанне публічнага класа BinaryOperation рэалізуе TreeNode {public int apply () {return arg1 (). прымяніць () * arg2 (). прымяняць (); } ...}

Але вы бачыце, што тут ёсць нейкая залішняя колькасць. Кожны падклас BinaryOperation будзе TreeNode. Такім чынам, зрабіце наступнае:

прыватны абстрактны клас BinaryOperation рэалізуе TreeNode {public Abstract int apply (); грамадскі TreeNode arg1 () {return arg1val; } грамадскі TreeNode arg2 () {return arg2val; } прыватны TreeNode arg1val; прыватны TreeNode arg2val; } дадатак публічнага класа пашырае BinaryOperation {public int apply () {return arg1 (). прымяніць () + arg2 (). прымяняць (); } ...} Мультыплікацыя публічнага класа пашырае BinaryOperation {public int apply () {return arg1 (). прымяніць () * arg2 (). прымяняць (); } ...}

Такім чынам вашы намеры стануць больш яснымі і ўсё "нармалізуецца". Спасылкі на TreeNode лакалізуюцца і прасцей змяніць. Такім чынам, абстрактныя класы дазваляюць збіраць агульныя характарыстыкі для адпаведных класаў, у той час як інтэрфейсы прадастаўляюць кантракты, якія можна выкарыстоўваць для апрацоўкі патэнцыйна не звязаных класаў.


адказ 3:

Ключавое слова інтэрфейсу ў файле паведамляе вам (і кампілятару Java), што код у гэтым файле вызначае ролю, якую аб'ект можа гуляць у вашай праграме.

Абстрактнае ключавое слова ў файле паведамляе вам (і кампілятару Java), што код у гэтым файле вызначае метад подпісаў (імёны і параметры) для класа, але ўтрымлівае код толькі для некаторых метадаў. Астатняе трэба зрабіць самастойна.

Анатацыя - гэта абрэвіятура, якая можа быць вельмі практычнай, але карыстацкі інтэрфейс з'яўляецца ключавой канцэпцыяй для аб'ектна-арыентаванага праграмавання Java.

Інтэрфейс - гэта назва і вызначэнне ролі, якую аб'ект можа гуляць у вашай праграме.

Калі клас мае ў сваёй дэкларацыі выраз "рэалізуе SomeInterfaceName", абяцанне (прымушанае кампілятарам Java) абяцае, што клас мае правільныя метады, і вы можаце проста рабіць выгляд, што гэта асобнік SomeInterfaceName . Файл інтэрфейсу вызначае метады, з дапамогай якіх іншыя класы могуць узаемадзейнічаць з усім, што, як мяркуецца, выконвае гэтую ролю (таксама вядомы як рэалізацыя гэтага інтэрфейсу).

Напрыклад, у ролі List - гэта асобнік аб'екта, які змяшчае спасылкі на некалькі іншых асобнікаў аб'екта, і спасылкі можна дадаваць і выдаляць, а спіс адсочвае іх. Такім чынам, калі вы бачыце "Рэалізаваны спіс", вы ведаеце, што вы можаце знайсці add () і get () і г.д. Што яшчэ больш важна, гэта кампілятар Java ведае, таму ён ведае, што законна выклікаць іншы клас для .add () класа, які мае "рэалізаваны спіс".

Абстрактны клас - гэта ярлык, які карысны, калі вы будуеце іерархію класаў і высвятляеце, што два ці больш класаў маюць шмат агульнага і, магчыма, павінны мець бацькоўскі клас, у якім гэты код жыве ... .. Але ёсць не дастаткова агульнага меркавання, што бацькоўскі клас можа на самой справе самастойна і выкарыстоўвацца. Вы ведаеце, што там павінны быць біты, але вы не можаце знайсці стандартную рэалізацыю для гэтых біт.

Такім чынам, вы акрэсліваеце бацькоўскі клас, уключаючы подпісы метадаў для рэчаў, якія вы пакуль не можаце рэалізаваць, і ўстаўляеце на яго абстрактнае ключавое слова, і зараз та-да! Гэта абстрактны клас. Цяпер вы можаце рэалізаваць дзіцячыя класы і дадаць у іх код для рэалізацыі пэўных формаў паводзін. Ці хтосьці іншы можа прыйсці і рэалізаваць дзіцячыя заняткі з паводзінамі, пра якое вы ніколі не думалі.

Якія эфекты аб'явы рэзюмэ класа?

Абстрактныя класы ў дзікай прыродзе звычайна сустракаюцца толькі ў іерархіях класаў у API, прадастаўленых Sun ці іншымі пастаўшчыкамі. Вы амаль ніколі не хочаце ствараць абстрактныя класы для сваіх мэтаў, хаця вам можа (рэдка) спатрэбіцца стварыць для дзіцяці абстрактны клас і завяршыць яго рэалізацыю.

Калі вы на самой справе павінны былі гэта прачытаць, вы амаль напэўна не знаходзіцеся на ўзроўні, дзе вы павінны ствараць свае ўласныя абстрактныя класы. Замест гэтага выкарыстоўвайце гэтую энергію для навучання, каб пазнаёміцца ​​з інтэрфейсамі. Адна з класічных памылак, якую робяць новыя праграмісты OO, - зацікавіцца спадчынай і ствараць складаныя іерархіі класа, а не проста выкарыстоўваць кампазіцыю.

Калі вы наведваеце курс каледжа, і ваш настаўнік кажа вам, каб ваш клас пашырыў той ці іншы абстрактны клас, гэта азначае, што абстрактны клас не рэалізаваў адзін ці некалькі метадаў. Паколькі вы пашыраеце абстрактны клас (стварыўшы падклас) замест таго, каб рэалізаваць інтэрфейс, вам давядзецца рэалізаваць толькі якія адсутнічаюць біты. Ваш інструктар выкарыстоўвае абстрактны клас, каб даць вам часткова вырашаную праблему і дазволіць вам засяродзіцца на ўроку замест астатняй часткі неабходнай структуры класа.


адказ 4:

Ключавое слова інтэрфейсу ў файле паведамляе вам (і кампілятару Java), што код у гэтым файле вызначае ролю, якую аб'ект можа гуляць у вашай праграме.

Абстрактнае ключавое слова ў файле паведамляе вам (і кампілятару Java), што код у гэтым файле вызначае метад подпісаў (імёны і параметры) для класа, але ўтрымлівае код толькі для некаторых метадаў. Астатняе трэба зрабіць самастойна.

Анатацыя - гэта абрэвіятура, якая можа быць вельмі практычнай, але карыстацкі інтэрфейс з'яўляецца ключавой канцэпцыяй для аб'ектна-арыентаванага праграмавання Java.

Інтэрфейс - гэта назва і вызначэнне ролі, якую аб'ект можа гуляць у вашай праграме.

Калі клас мае ў сваёй дэкларацыі выраз "рэалізуе SomeInterfaceName", абяцанне (прымушанае кампілятарам Java) абяцае, што клас мае правільныя метады, і вы можаце проста рабіць выгляд, што гэта асобнік SomeInterfaceName . Файл інтэрфейсу вызначае метады, з дапамогай якіх іншыя класы могуць узаемадзейнічаць з усім, што, як мяркуецца, выконвае гэтую ролю (таксама вядомы як рэалізацыя гэтага інтэрфейсу).

Напрыклад, у ролі List - гэта асобнік аб'екта, які змяшчае спасылкі на некалькі іншых асобнікаў аб'екта, і спасылкі можна дадаваць і выдаляць, а спіс адсочвае іх. Такім чынам, калі вы бачыце "Рэалізаваны спіс", вы ведаеце, што вы можаце знайсці add () і get () і г.д. Што яшчэ больш важна, гэта кампілятар Java ведае, таму ён ведае, што законна выклікаць іншы клас для .add () класа, які мае "рэалізаваны спіс".

Абстрактны клас - гэта ярлык, які карысны, калі вы будуеце іерархію класаў і высвятляеце, што два ці больш класаў маюць шмат агульнага і, магчыма, павінны мець бацькоўскі клас, у якім гэты код жыве ... .. Але ёсць не дастаткова агульнага меркавання, што бацькоўскі клас можа на самой справе самастойна і выкарыстоўвацца. Вы ведаеце, што там павінны быць біты, але вы не можаце знайсці стандартную рэалізацыю для гэтых біт.

Такім чынам, вы акрэсліваеце бацькоўскі клас, уключаючы подпісы метадаў для рэчаў, якія вы пакуль не можаце рэалізаваць, і ўстаўляеце на яго абстрактнае ключавое слова, і зараз та-да! Гэта абстрактны клас. Цяпер вы можаце рэалізаваць дзіцячыя класы і дадаць у іх код для рэалізацыі пэўных формаў паводзін. Ці хтосьці іншы можа прыйсці і рэалізаваць дзіцячыя заняткі з паводзінамі, пра якое вы ніколі не думалі.

Якія эфекты аб'явы рэзюмэ класа?

Абстрактныя класы ў дзікай прыродзе звычайна сустракаюцца толькі ў іерархіях класаў у API, прадастаўленых Sun ці іншымі пастаўшчыкамі. Вы амаль ніколі не хочаце ствараць абстрактныя класы для сваіх мэтаў, хаця вам можа (рэдка) спатрэбіцца стварыць для дзіцяці абстрактны клас і завяршыць яго рэалізацыю.

Калі вы на самой справе павінны былі гэта прачытаць, вы амаль напэўна не знаходзіцеся на ўзроўні, дзе вы павінны ствараць свае ўласныя абстрактныя класы. Замест гэтага выкарыстоўвайце гэтую энергію для навучання, каб пазнаёміцца ​​з інтэрфейсамі. Адна з класічных памылак, якую робяць новыя праграмісты OO, - зацікавіцца спадчынай і ствараць складаныя іерархіі класа, а не проста выкарыстоўваць кампазіцыю.

Калі вы наведваеце курс каледжа, і ваш настаўнік кажа вам, каб ваш клас пашырыў той ці іншы абстрактны клас, гэта азначае, што абстрактны клас не рэалізаваў адзін ці некалькі метадаў. Паколькі вы пашыраеце абстрактны клас (стварыўшы падклас) замест таго, каб рэалізаваць інтэрфейс, вам давядзецца рэалізаваць толькі якія адсутнічаюць біты. Ваш інструктар выкарыстоўвае абстрактны клас, каб даць вам часткова вырашаную праблему і дазволіць вам засяродзіцца на ўроку замест астатняй часткі неабходнай структуры класа.