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


адказ 1:

Дарын добра паставілася да гэтага адказу, але хацелася б дадаць яшчэ некалькі пунктаў.

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

Інтэрфейс, які выкарыстоўваецца C ++, вызначае API для класа. У ідэале гэты API не мае ўбудаванай рэалізацыі, таму што распрацоўшчык, які хоча выкарыстоўваць клас, павінен толькі зразумець, якія метады даступныя і як іх выкарыстоўваць. Менавіта так павінен гаварыць API.

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

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


адказ 2:

Замест таго, што важна, чаму абстрактны клас ці інтэрфейс?

Напрыклад, распрацоўшчык 1 хоча выкарыстаць модуль (клас) функцыі, распрацаваныя распрацоўшчыкам 2, і абедзве працуюць у адным кіраванні, але тут ёсць праблема надзейнасці. Што адбываецца, калі d2 не вынікае сінтаксісу, які ён абяцаў для d1 і d2 у будучыні? Калі будуць унесены некаторыя змены, d1 пацерпіць у такім выпадку. Тут можна зрабіць тое, што лідэр запісвае інтэрфейс альбо абстрактны клас, функцыі якога павінны быць рэалізаваны d2 і цяпер могуць альбо не парушаюць імя функцыі, тып вяртання альбо з-за сваёй функцыянальнасці яны павінны выконваць яго ў адпаведнасці з інструкцыямі лідэра. быць рэалізаваны. Такім чынам, d1 можа пачаць працаваць, паглядзеўшы толькі на інтэрфейс, які прадастаўляецца лідэрам, бо d2, безумоўна, будзе рэалізаваць свае функцыі пазней, калі яшчэ не зрабіў гэтага.

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

Зараз для параўнання

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