Bir interfeys və mücərrəd sinif arasındakı fərq nədir?

Bir interfeys və mücərrəd sinif arasındakı fərq nədir?

1558
16 дек. Sarfraz tərəfindən 16 dekabrda təyin olundu 2009-12-16 11:15 '09 saat 11:15 'da 2009-12-16 11:15
@ 38 cavab
  • 1
  • 2

Arayüzlər

İnterfeys bir müqavilədir : interfeys yazan şəxs "Hey, mən bu kimi görünən şeyi qəbul edirəm" deyir və interfeysdən istifadə edən şəxs "Tamam, yazdığım sinif bu kimi görünür" deyir.

İnterfeys bir boşluqdur . Yalnız metod imza mövcuddur, bu üsullardan heç bir cisim yoxdur. İnterfeys heç bir şey edə bilməz. Bu yalnız bir nümunədir.

Məsələn (pseudocode):


İcra

Soyut dərslər və interfeys müxtəlif anlayışlar olmalı olsa da, tətbiqlər bu bəyanımı bəzən səhv edirlər. Bəzən düşündükləriniz belə deyil.

Java'da bu qayda ciddi şəkildə müşahidə edilir, PHP interfeysində elan edilmiş üsul olmadan abstrakt siniflər olur.

Pythonda mücərrəd siniflər ABC modulundan əldə edə biləcək və əslində metaclasses və bu səbəbdən dərslərdən istifadə edə biləcəyiniz bir proqram alətidir. Və interfeys bu dildə yazaraq ördəklə daha çox bağlıdır və bu, konvensiyalar və descriptors adlanan xüsusi üsullar (__method__ metodları) arasında birləşmədir.

Proqramlaşdırma ilə adi olaraq, başqa bir dildə nəzəriyyə, təcrübə və təcrübə var :-)

2044
16 дек. Cavab 16 dekabrda e-tenderlə verilir . 2009-12-16 11:37 '09 at 11:37 'da 2009-12-16 11:37

Soyut sinifinterfeys arasında əsas texniki fərqlər:

border=0
  • Abstract dərsləri sabitləri, üzvləri, kölgə üsulları (bədənsiz üsullar) və müəyyən üsullar ola bilər, interfeyslər yalnız sabit və metodlardan ibarət ola bilər.

  • Bir abstrakt sinif üsulları və üzvləri hər hansı bir görünüş ilə müəyyən edilə bilər, buna baxmayaraq bütün interfeys üsulları public olaraq müəyyən edilməlidir (default olaraq, onlar ictimai olaraq təyin olunur).

  • Mücərrəd sinif miras alındıqda, konkret bir uşaq sinfi mücərrəd üsulları müəyyən etməlidir, əksinə, mücərrəd sinif başqa bir abstrakt sinfi genişləndirə bilər və ana sinifdən abstrakt metodlar müəyyən edilməməlidir.

  • Eynilə, bir interfeys uzanan bir interfeys ana interfeysdən metodların tətbiq edilməsi üçün məsuliyyət daşımır. Bu, interfeyslərin hər hansı bir tətbiqi müəyyən edə bilməməsi ilə bağlıdır.

  • Bir uşağın bir sinif uzadılması və ya bir sinif bir neçə digər interfeysin tətbiq oluna biləcəyi halda, bir uşağın yalnız bir sinifi (mücərrəd və ya konkret) genişləndirə bilər.

  • Bir uşaq sinifi eyni və ya daha az məhdudlaşdırıcı görünürlük ilə abstrakt metodları müəyyən edə bilər, buna baxmayaraq bir interfeys tətbiq edən bir sinif eyni görünürlüğüyle (ictimai) üsulları müəyyən etməlidir.

795
16 дек. Cavab 16 dekabrda Justin Johnson tərəfindən verilir . 2009-12-16 13:11 '09 at 13:11 2009-12-16 13:11

İnterfeys yalnız funksiyaların tərifini / imzasını ehtiva edir və biz ümumi funksiyalara, eyni zamanda ümumi imzalara sahib olduqda, soyut bir sinifdən istifadə etməmiz lazımdır. Soyut bir sinifdən istifadə edərək eyni zamanda davranış və funksionallıq təmin edə bilərik. Soyuducu bir sinif devraldıran bir başqa geliştirici, bu funksiyaları asanlıqla istifadə edə bilər, çünki onlar boşluqları doldurmalıdırlar.

2019

15 сент. Cavab Vivek 15 sentyabr verilir. 2013-09-15 11:59 '13 at 11:59 2013-09-15 11:59

Bəzi fərqlər:

Cədvəl şəklində:

2019

37
16 мая '13 в 8:55 2013-05-16 08:55 cavab softmage99 verildi16 May 16, '13 da 8:55 2013-05-16 08:55

Çox cavablarda qeyd edilmiş fərqləri qeyd etmək istəmirəm (ictimai statik son dəyişənlər üçün interfeysdə və mücərrəd siniflərdə qorunan xüsusi üsullara dəstək üçün)

Sadəcə qoyub, demək istəyirəm:

interfeys: əlaqəli olmayan bir neçə obyektlə müqavilə bağlamaq

mücərrəd sinif: bir neçə əlaqəli obyektlər arasında eyni və ya fərqli davranışı həyata keçirir

Oracle sənədlərindən

Soyut dərslərdən istifadə etməyi düşünün:

  • Bir neçə yaxın sinif arasında kod paylaşmaq istəyirsən.
  • Soyuducu sinifinizi genişləndirən dərslər bir çox ümumi üsul və ya sahələrə malikdir və ya ictimai obyektlərdən (məsələn, qorunan və qapalı) başqa giriş modifikatorları tələb edir.
  • Statik olmayan və qeyri-son sahələri elan etmək istəyirsiz.

Aşağıdakı hallarda interfeyslərin istifadəsini nəzərdən keçirin:

  • Interfeysinizi həyata keçirmək üçün əlaqəsiz dərslər gözləyirsiniz. Məsələn, bir çox əlaqəsiz obyekt Serializable interfeysini tətbiq edə bilər.
  • Belirli bir veri türünün davranışını belirtmek istersiniz, ancaq davranışını kimin uyguladığıyla ilgilenmiyorsunuz.
  • Birdən çox növü miras istifadə etmək istəyirik.

mücərrəd sinif dəstləri "sinifdir". İnterfeys dərslər üçün "fürsət" təmin edir.

Java bir proqramlaşdırma dili olaraq arıyorsanız, bir neçə yenilik əlavə edin:

Java 8, default metodunun funksiyasını təmin edərək interfaceabstract siniflər arasındakı fərqi bir az azaldıb. Arayış metodu üçün heç bir tətbiq edilməmişdir, artıq yalnışdır.

Ətraflı məlumat üçün bu sənədlərə baxın.

Daha yaxşı anlamaq üçün kod nümunələri üçün bu sual SE-ə baxın.

Bir interfeys və mücərrəd sinif arasındakı fərqi necə izah etməliyəm?

35
27 нояб. Cavab Ravindra Babu 27 Noyabrda verilir. 2015-11-27 15:42 '15 'da 15:42' de

Əsas odur ki:

  • Abstract obyektlərə yönəldi . Bu, obyektin və / və ya funksiyalarının yerinə yetirilməsi lazım olan əsas məlumatları təqdim edir. O, obyektin əsas xüsusiyyətləri ilə əlaqələndirir: nə malikdir və nə edə bilər. Nəticədə, eyni mücərrəd sinifdən irəli gələn obyektlər əsas xüsusiyyətləri bölüşür (ümumiləşdirmə).
  • İnterfeys funksionallığa yönəldilmişdir . O, obyektin funksiyasını müəyyənləşdirir. Nə obyektin olursa olsun, interfeysdə müəyyən edilmiş bu funksiyaları yerinə yetirə biləcəyi halda, bu yaxşıdır. O qalanları görmür. Bir obyekt / sinif funksiyaların bir neçə (qrupu) ola bilər; Buna görə bir sinif bir neçə interfeys tətbiq edə bilər.
26
29 сент. cavab verdi yusup 29 sept. 2014-09-29 12:54 '14 at 12:54 2014-09-29 12:54

Mən 300 mərtəbəli bir bina tikirəm

İnterfeys planı

  • Məsələn, Servlet (I)

Bina 200 mərtəbəyə qədər tikilmişdir - qismən tamamlanmışdır --- abstrakt

  • Partial tətbiq, məsələn, ümumi və HTTP servlet

Tamamlanmış beton tikililərin tikintisi

  • Tam tətbiq, məsələn, öz servletiniz

İnterfeys

  • Biz həyata keçirməyə, yalnız tələblərə dair heç bir şey bilmirik. İnterfeysdə gedə bilərik.
  • Hər bir metod, ictimai və mübahisə default edir.
  • Bu, 100% təmiz mücərrəd sinifdir.
  • İctimaiyyəti bəyan etsək, biz fərdi və qorunub saxlaya bilmərik
  • Soyqırım elan edərsə, son, statik, senkronize, strictfp və doğma elan edə bilməyəcəyik.
  • Hər bir interfeys açıq, statik və yekun vəziyyətə malikdir
  • Serializasiya və keçidlər tətbiq edilmir, çünki interfeys üçün nümunə yarada bilmirik.
  • Qeyri-uçucu olduğu üçün son
  • Hər dəyişən statikdir
  • Bir interfeys içərisində bir dəyişən elan etdikdə, elan edərkən dəyişənləri başlatmalıyıq
  • Instance və statik bloklara icazə verilmir

Xülasə

  • Qismən icra
  • Soyut bir üsula sahibdir. Bundan əlavə o, betondan istifadə edir
  • Mücərrəd sinif metodunun dəyişənləri üçün məhdudiyyətlər olmadan
  • Soyut sinif dəyişən dəyişənləri üçün heç bir məhdudiyyət yoxdur
  • Abstract olanlardan başqa digər modifikatorları bəyan edə bilmirik.
  • Değişkenleri başlatmak üçün heç bir məhdudiyyət yoxdur

DurgaJobs saytından götürülmüşdür

23
09 июля '14 в 21:00 2014-07-09 21:00 Cavab Jaichander tərəfindən 09 iyul '14 'da 21:00' də verilir 2014-07-09 21:00

Miras ierarxiyasında polimorfik davranış təmin etmək istəyirsinizsə, mücərrəd siniflərdən istifadə edin.

Tamamilə əlaqəsiz olan siniflər üçün polimorfik davranışın istəyirsinizsə, interfeysdən istifadə edin.

23
28 мая '12 в 7:42 2012-05-28 07:42 heykəltəraş tərəfindən cavab 28 may '12 saat 07:42 'də verilir 2012-05-28 07:42

Yenə bu suala yenidən baxaq:

Bildiyiniz ilk şey 1/1 və 1 * 1 nəticələrinin eyni olmasıdır, lakin bu, vurma və bölünmə eynidır. Aydındır ki, yaxşı münasibətlər var, amma hər ikiniz fərqlidirlər.

Mən əsas fərqləri qeyd edəcəyəm və qalanları artıq izah olunur:

Soyut dərslər sinif hiyerarşilərinin modelləşdirilməsi üçün faydalıdır. İlk baxışdan, hər hansı bir tələb, biz qismən nə lazımdır dəqiq bilirik, lakin biz nə qurmaq bilirik . Və sizin mücərrəd dərsləriniz sizin əsas siniflərinizdir.

İnterfeys digər hiyerarşiləri və ya sinifləri nə edə biləcəyimi bilmək üçün faydalıdır. Və bir şeyə qadir olduğumu deyirsinizsə, bu qabiliyyətiniz olmalıdır. İnterfeys bu sinfi eyni funksiyaları yerinə yetirmək üçün məcburi olaraq qeyd edəcəkdir.

18
11 апр. Dhananjay tərəfindən verilmiş cavab Apr 11 2012-04-11 08:18 '12 at 8:18 'da 2012-04-11 08:18

Hər hansı tətbiqi olmayan mücərrəd sinif bir interfeysə bənzəyir; Ancaq mücərrəd sinif və interfeys arasındakı oxşarlıqdan çox fərq var. Hər iki konsepsiyanı izah edim və onların oxşarlıqlarını və fərqlərini müqayisə et.

Soyut bir sinif nədir?

Mücərrəd sinif yaradıla bilməyən xüsusi bir sinifdir. Beləliklə, sual yaranarsa, nə üçün bir sinfə ehtiyacımız var? Xülasə sinfi yalnız subclassified (miras alınmış) olmalıdır. Başqa sözlə, digər siniflərdən miras almağa imkan verir, lakin yaradıla bilməz. Üstünlük, bütün alt siniflər üçün müəyyən hiyerarşiləri təmin etməkdir. Sadə mənada, bütün subclassları eyni hiyerarşiyə və ya standarta uyğun gəlməyə məcbur edən bir müqavilədir.

Bir interfeys nədir?

İnterfeys bir sinif deyil. Bu "Interface" sözü ilə müəyyənləşdirilmiş bir obyektdir. Interfeys heç bir tətbiq edilməmişdir; yalnız bir imza, ya da başqa sözlə, bir bədənsiz üsulların yalnız bir təsviri var. Soyuducu siniflə oxşarlıqlardan biri kimi, bütün subclasslar üçün hiyerarşi müəyyən etmək üçün müəyyən edilmiş və ya müəyyən üsul və onların arqumentlərini müəyyənləşdirən bir müqavilədir. İkincisi arasındakı əsas fərq, bir sinif birdən çox interfeysi tətbiq edə bilər, lakin yalnız bir mücərrəd sinif miras ala bilər. C # birdən çox mirasın dəstəklənməməsi səbəbindən, interfeyslər birdən çox miras tətbiq etmək üçün istifadə olunur.

Həm birlikdə

Bir interfeys yaratdıqda, əsasən tətbiq olunan dərslər tərəfindən yenidən müəyyənləşdirilməsi lazım olan hər hansı bir tətbiq edilmədən bir sıra üsullar yaradırıq. Üstünlük, sinifin iki sinifin bir hissəsi olmaq üçün bir yol təqdim etməsidir: miras ierarxiyasından biri və interfeysdən biri.

Soyut bir sinif yaratdığımız zaman, bir və ya daha çox tamamlanmış üsula sahib ola biləcək bir əsas sinif yaradırıq, lakin ən azı bir və ya bir çox metod tamamlanmamışdır və öz əksini tapmışdır. Soyut sinifin bütün üsulları tamamlanmazsa, bu interfeysə bənzəyir. Mücərrəd sinifin məqsədi türetilmiş siniflərin necə işləməyinin əsas sinifinin təsvirini təmin etməkdir və proqramçılara tətbiqin tətbiq olunan dərslərdə yerləşdirilməsinə icazə verir.


İnterfeys və mücərrəd sinif arasında oxşarlıqlar və fərqlər var. 2019

15 нояб. Cavab Thilina Sandunsiri tərəfindən verilir . 2015-11-15 06:51 '15, 6:51 'da, 2015-11-15 06:51

Çox sadədir.

İnterfeys yalnız abstrakt metodlara və başqa bir şeyə icazə verilmiş bir sinif hesab edə bilərsiniz.

Beləliklə, interfeys yalnız "elan" edə və sinifin olmasını istədiyi davranışı müəyyən etmir.

Soyut sinif, həm də (abstrakt metodlardan istifadə etməklə) bəyan etməyə və sinifin istədikləri davranışı müəyyən etməyə imkan verir (metodun tam tətbiqini istifadə edərək).

Daimi bir sinif, sinifin istədikləri davranışları / hərəkətləri bəyan etmək əvəzinə, müəyyən etmək üçün imkan verir.

Sonuncu

Java'da birdən çox interfeys tətbiq edə bilərsiniz, ancaq bir (mücərrəd sinif və ya sinif) bir ...

Budur, müəyyən bir davranışın mirası yalnız hər sinif üçün icazə verilmiş məhdudlarla məhdudlaşır ... yəni. A, B və C siniflərindən davranışla əhatə olunan bir sinif istəyirsənsə, aşağıdakıları etməlisiniz: A sinfi B sinifini genişləndirir, C sinifləri genişlənir .. birdən çox varisliyə sahib olmaq üçün bir az dəyirmi yol ...

İnterfeyslər, digər tərəfdən, edə bilərsiniz: C interfeysi A, B tətbiq edir

Beləliklə, Java bir çox mirasın yalnız "elan edilmiş davranış", yəni " interfeyslər və xüsusi bir davranışı olan yalnız tək mirasçılıqdır .. Mən təsvir etdiyim mövzuda bir dəyirmi etmirsinizsə ...

Ümid edirəm bu mənada.

12
23 июля '14 в 2:36 2014-07-23 02:36 cavab g00dnatur3 23 iyul '14 'də 2:36 2014-07-23 02:36 verilir

Bir abstrakt sinfi ilə interfeysin müqayisə edilməsi səhvdir. Bunun əvəzinə iki digər müqayisə edilməlidir: 1) interfeys qarşı və 2) abstrakt və son sinif .

Interface vs Class

Bir interfeys iki obyekt arasında bir müqavilədir. Məsələn, mən bir postman deyiləm və təslim üçün bir paketsiniz. Mən sizin göndərmə ünvanınızı tapa biləcəyinizi gözləyirəm. Kimsə mənə bir paket verəndə, onun çatdırılma ünvanını bilməli:

 interface Package { String address(); } 

A sinif müqaviləyə tabe olan bir qrup obyektdir. Məsələn, mən "Box" qrupundan bir qutuyum və Postman tərəfindən tələb olunan müqaviləyə təqdim edirəm. Eyni zamanda digər müqavilələrə dəvət edirəm:

 class Box implements Package, Property { @Override String address() { return "5th Street, New York, NY"; } @Override Human owner() { // this method is part of another contract } } 

Finala qarşı Abstract

Mücərrəd sinif qeyri-obyektlərin bir qrupudur. Bəzi hissələri əldən vermədikləri üçün istifadə edilə bilməz. Məsələn, mən GPS dəstəyi ilə mücərrəd bir qutu oldum - xəritədə mövqeyimi necə idarə edəcəyini bilirəm:

 abstract class GpsBox implements Package { @Override public abstract String address(); protected Coordinates whereAmI() { // connect to GPS and return my current position } } 

Bu sinif, miras alındığında / başqa bir siniflə uzadıldığında, çox faydalı ola bilər. Özü də - heç bir şey olmadığı üçün faydasızdır. Abstract dərsləri son siniflər elementləri ola bilər.

Son sinif istifadə edilə bilən tam obyektlərin bir qrupudur, lakin dəyişdirilə bilməz. Onlar necə işlədiyini və nə edəcəyini dəqiq bilirlər. Məsələn, mən həmişə tikinti zamanı göstərilən ünvana gedən bir qutu deyiləm:

 final class DirectBox implements Package { private final String to; public DirectBox(String addr) { this.to = addr; } @Override public String address() { return this.to; } } 

Çox dildə, məsələn, Java və ya C ++, yalnız bir sinif var , nə mücərrəd, nə də qəti. Такой класс может быть унаследован и может быть инстанцирован. Я не думаю, что это строго соответствует объектно-ориентированной парадигме.

Опять же, сравнение интерфейсов с абстрактными классами неверно.

10
ответ дан yegor256 25 июля '14 в 0:57 2014-07-25 00:57

Единственное отличие состоит в том, что можно участвовать в множественном наследовании, а другое не может.

Определение интерфейса со временем изменилось. Считаете ли вы, что интерфейс имеет только декларации методов и только контракты? Как насчет статических конечных переменных и как насчет определений по умолчанию после Java 8?

Интерфейсы были введены в Java из-за проблемы с алмазом с множественным наследованием и того, что они на самом деле намерены делать.

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

См. Почему Java разрешает статические конечные переменные в интерфейсах, когда они предназначены только для контрактов? ,

9
ответ дан Vivek Vermani 25 авг. '14 в 20:53 2014-08-25 20:53

Объяснение можно найти в Интерфейс VS Abstract Class в PHP .

Nəticə

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

9
ответ дан Alaa 10 апр. '12 в 12:00 2012-04-10 12:00

Короче говоря, различия заключаются в следующем:

Синтаксические различия между Интерфейсом и Абстрактным классом :

  • Методы и члены абстрактного класса могут иметь любую видимость. Все методы интерфейса должны быть общедоступными .//Не верен с Java 9 больше
  • Конкретный дочерний класс класса Аннотация должен определить все абстрактные методы. Абстрактный дочерний класс может иметь абстрактные методы. Интерфейс, расширяющий другой интерфейс, не должен обеспечивать реализацию по умолчанию для методов, унаследованных от родительского интерфейса.
  • Детский класс может расширять только один класс. интерфейс может расширять несколько интерфейсов. Класс может реализовывать несколько интерфейсов.
  • Детский класс может определять абстрактные методы с той же или менее ограничительной видимостью, тогда как класс, реализующий интерфейс , должен определять все методы интерфейса как общедоступные.
  • Абстрактные классы могут иметь конструкторы, но не интерфейсы .
  • Интерфейсы Java 9 имеют частные статические методы.

В интерфейсах теперь:

public static - поддерживается
public abstract - поддерживается
public default - поддерживается
private static - поддерживается
private abstract - ошибка компиляции
private default - ошибка компиляции
private - поддерживается

8
ответ дан Pritam Banerjee 27 июня '17 в 4:43 2017-06-27 04:43

В чем разница между интерфейсом и абстрактным классом?

Абстрактный класс

  • Для абстрактного класса метод должен быть объявлен как абстрактный. Абстрактные метод не имеет реализации.

  • Абстрактные методы могут быть объявлены с помощью модификаторов доступа, таких как public, внутренние, защищенные и т.д. При реализации этих методов в подклассе вы должны определить их с той же (или менее ограниченной) видимостью.

  • Абстрактные классы могут содержать переменные и конкретные методы.

  • Класс может наследовать только один абстрактный класс

  • Множественное наследование невозможно для абстрактного класса.

Интерфейс

  • Для интерфейса все методы по умолчанию являются абстрактными. Таким образом, нельзя объявлять переменные или конкретные методы в интерфейсах.

  • Все методы, объявленные в интерфейсе, должны быть общедоступными.

  • Интерфейсы не могут содержать переменные и конкретные методы, кроме константы.

  • Класс может реализовывать множество интерфейсов

  • Возможно наследование нескольких интерфейсов.

8
ответ дан Roshan Padole 18 июня '15 в 11:17 2015-06-18 11:17

Интерфейс: Поверните (поверните налево, поверните направо.)

Абстрактный класс: Колесо.

Класс: Рулевое колесо, полученное из колеса, предоставляет интерфейс Turn

Один из них относится к категоризации поведения, которое может быть предложено в различных областях, а другое - для моделирования онтологии вещей.

7
ответ дан Sentinel 07 марта '17 в 0:46 2017-03-07 00:46

Если у вас есть общие методы, которые могут использоваться несколькими классами, для абстрактных классов. Иначе, если вы хотите, чтобы классы следовали определенному плану для интерфейсов.

Следующие примеры демонстрируют это.

Абстрактный класс в Java:

 abstract class animals { // They all love to eat. So let implement them for everybody void eat() { System.out.println("Eating..."); } // The make different sounds. They will provide their own implementation. abstract void sound(); } class dog extends animals { void sound() { System.out.println("Woof Woof"); } } class cat extends animals { void sound() { System.out.println("Meoww"); } } 

Ниже приведена реализация интерфейса в Java:

 interface Shape { void display(); double area(); } class Rectangle implements Shape { int length, width; Rectangle(int length, int width) { this.length = length; this.width = width; } @Override public void display() { System.out.println("****\n* *\n* *\n****"); } @Override public double area() { return (double)(length*width); } } class Circle implements Shape { double pi = 3.14; int radius; Circle(int radius) { this.radius = radius; } @Override public void display() { System.out.println("O"); // :P } @Override public double area() { return (double)((pi*radius*radius)/2); } } 

Некоторые важные ключевые моменты в двух словах:

  1. Переменные, объявленные в интерфейсе Java, по умолчанию являются окончательными. Абстрактные классы могут иметь не конечные переменные.

  2. Переменные, объявленные в интерфейсе Java, по умолчанию статичны. Абстрактные классы могут иметь нестатические переменные.

  3. Участники интерфейса Java по умолчанию являются общедоступными. Абстрактный класс Java может иметь обычные вкусы членов класса, таких как частные, защищенные и т.д.

5
ответ дан Pransh Tiwari 03 окт. '17 в 9:25 2017-10-03 09:25

На самом деле не ответ на исходный вопрос, но как только вы получите ответ на разницу между ними, вы будете вводить в каждом случае дилемму: Когда использовать интерфейсы или абстрактные классы? Когда использовать оба?

Я ограничил знание ООП, но просмотр интерфейсов как эквивалента прилагательного в грамматике работал у меня до сих пор (исправьте меня, если этот метод фиктивный!). Например, имена интерфейсов похожи на атрибуты или возможности, которые вы можете дать классу, и класс может иметь много из них: ISerializable, ICountable, IList, ICacheable, IHappy,...

4
ответ дан azkotoki 16 дек. '09 в 11:48 2009-12-16 11:48

Многие младшие разработчики ошибаются, думая о интерфейсах, абстрактных и конкретных классах как о незначительных вариациях одной и той же вещи и выбирают одну из них исключительно по техническим причинам: нужно ли мне многократное наследование? Нужно ли мне какое-то место для размещения общих методов? Нужно ли мне беспокоиться о чем-то отличном от конкретного класса? Это неправильно, и скрытые в этих вопросах основная проблема: "Я" . Когда вы сами пишете код, вы редко думаете о других существующих или будущих разработчиках, работающих с вашим кодом или с вашим кодом.

Интерфейсы и абстрактные классы, хотя, по-видимому, с технической точки зрения, имеют совершенно разные значения и цели.

Xülasə

  • Интерфейс определяет контракт , который выполнит некоторая реализация.

  • Абстрактный класс предоставляет поведение по умолчанию , которое ваша реализация может повторно использовать.

Альтернативное резюме

  • Интерфейс предназначен для определения общедоступных API
  • Абстрактный класс предназначен для внутреннего использования и для определения SPI

О важности скрытия деталей реализации

Конкретный класс действительно работает, очень определенным образом. Например, ArrayList использует непрерывную область памяти для хранения списка объектов в компактном виде, который предлагает быстрый случайный доступ, итерацию и изменения на месте, но ужасен при вставках, удалениях и иногда даже добавлениях; между тем, LinkedList использует узлы с двойной связью для хранения списка объектов, который вместо этого предлагает быструю итерацию, изменения на месте, а также вставку/удаление/добавление, но страшный случайный доступ. Эти два типа списков оптимизированы для разных вариантов использования, и это очень важно, как вы собираетесь их использовать. Когда вы пытаетесь выжать производительность из списка, с которым вы в большой степени взаимодействуете, и когда вы выбираете тип списка, вам следует тщательно выбрать, какой из них вы создаете.

С другой стороны, пользователям высокого уровня списка действительно не важно, как они реализованы, и они должны быть изолированы от этих деталей. Представьте себе, что Java не раскрывает интерфейс List , но имеет только конкретный класс List , который фактически является тем, что LinkedList сейчас. Все разработчики Java должны были настроить свой код для соответствия деталям реализации: избегать случайного доступа, добавлять кеш для ускорения доступа или просто переопределять ArrayList самостоятельно, хотя это было бы несовместимо со всем другим кодом, который действительно работает с List . Это было бы ужасно... Но теперь представьте себе, что мастера Java фактически понимают, что связанный список ужасен для большинства реальных случаев использования и решил перейти к списку массивов только для своего класса List . Это повлияет на производительность каждой Java-программы в мире, и люди не будут рады этому. И основным виновником является то, что детали реализации были доступны, и разработчики предположили, что эти детали являются постоянным контрактом, на который они могут положиться. Вот почему важно скрыть детали реализации и определить только абстрактный контракт. Это цель интерфейса: определить, какой тип ввода принимает метод, и какой вид вывода ожидается, не подвергая все кишки, которые заставляют программистов настраивать свой код, чтобы он соответствовал внутренним деталям, которые могут измениться при любом будущем обновлении.

Абстрактный класс находится в середине между интерфейсами и конкретными классами. Предполагается, что эта реализация поможет использовать общий или скучный код. Например, AbstractCollection предоставляет базовые реализации для isEmpty на основе размера 0, contains как повторение и сравнение, addAll как повторяющееся add и т.д. Это позволяет реализациям сосредоточиться на ключевых частях, которые различают их: как фактически хранить и извлекать данные.

API по сравнению с SPI

Интерфейсы - это шлюзы с низким уровнем сцепления между разными частями кода. Они позволяют библиотекам существовать и развиваться без нарушения каждого пользователя библиотеки, когда что-то меняет внутренне. Он называется Application Programming Интерфейс , а не Классы прикладного программирования. В меньших масштабах они также позволяют нескольким разработчикам успешно сотрудничать в крупных проектах, разделяя различные модули с помощью хорошо документированных интерфейсов.

Абстрактные классы - это сильные помощники для использования при реализации интерфейса, предполагая некоторый уровень детализации реализации. Альтернативно, абстрактные классы используются для определения SPI, интерфейсов поставщика услуг.

Разница между API и SPI является тонкой, но важной: для API основное внимание уделяется тем, кто использует , а для SPI основное внимание уделяется тому, кто реализует .

Добавление методов в API легко, все существующие пользователи API все еще будут компилироваться. Добавление методов в SPI сложно, поскольку каждый поставщик услуг (конкретная реализация) должен будет внедрить новые методы. Если интерфейсы используются для определения SPI, провайдер должен будет выпускать новую версию всякий раз, когда изменяется контракт SPI. Если вместо этого используются абстрактные классы, новые методы могут быть либо определены в терминах существующих абстрактных методов, либо как пустые throw not implemented exception заглушки, которые, по крайней мере, позволят более старую версию реализации службы все еще компилироваться и выполняться.

Заметка о Java 8 и методах по умолчанию

Несмотря на то, что в Java 8 введены методы по умолчанию для интерфейсов, что делает линию между интерфейсами и абстрактными классами еще более размытой, это было не так, чтобы реализации могли повторно использовать код, но чтобы упростить изменение интерфейсов, которые служат как API, так и как SPI (или ошибочно используются для определения SPI вместо абстрактных классов).

Какой из них использовать?

  • Должна ли существо быть публично использована другими частями кода или другим внешним кодом? Добавьте к нему интерфейс, чтобы скрыть детали реализации из публичного абстрактного контракта, что является общим поведением вещи.
  • Есть ли что-то, что должно иметь несколько реализаций с большим количеством общего кода? Сделайте как интерфейс, так и абстрактную, неполную реализацию.
  • Будет ли только одна реализация, и никто ее не будет использовать? Просто сделайте это конкретным классом.
    • "ever" - это долгое время, вы можете играть в нее безопасно и по-прежнему добавлять интерфейс поверх нее.

Следствие: другой путь часто ошибочно делается: при использовании вещи всегда старайтесь использовать наиболее общий класс/интерфейс, который вам действительно нужен. Другими словами, не объявляйте свои переменные как ArrayList theList = new ArrayList() , если у вас на самом деле не очень сильная зависимость от того, что он является массивом , и ни один другой тип списка не сократит его для вас. Вместо этого используйте List theList = new ArrayList или даже Collection theCollection = new ArrayList , если на самом деле это список, а не какой-либо другой тип коллекции.

3
ответ дан Sergiu Dumitriu 19 июня '16 в 12:02 2016-06-19 12:02

Я хотел бы добавить еще одно отличие, которое имеет смысл. Например, у вас есть структура с тысячами строк кода. Теперь, если вы хотите добавить новую функцию во всем коде, используя метод boostUI(), лучше добавить этот метод в абстрактный класс, а не в интерфейс. Поскольку, добавив этот метод в интерфейс, вы должны реализовать его во всем реализованном классе, но это не так, если вы добавите метод в абстрактный класс.

3
ответ дан Toothless 15 дек. '16 в 20:47 2016-12-15 20:47

Самый короткий способ подвести итог - это interface :

  • Полностью абстрактно, кроме методов default и static ; в то время как он имеет определения (сигнатуры методов + реализации) для методов default и static , у него есть только декларации (сигнатуры методов) для других методов.
  • В соответствии с правилами laxer, чем классы (класс может реализовать несколько interface s, а interface может наследовать от нескольких interface s). Все переменные неявно постоянны, независимо от того, указан ли он как public static final или нет. Все члены неявно public , независимо от того, указаны они как таковые или нет.
  • Обычно используется как гарантия того, что класс реализации будет иметь указанные функции и/или быть совместимым с любым другим классом, который реализует один и тот же интерфейс.

Между тем класс abstract :

  • В любом месте от полностью абстрактного до полностью реализованного, с тенденцией иметь один или несколько методов abstract . Может содержать как декларации, так и определения, с объявлениями, отмеченными как abstract .
  • Полноценный класс и подчиняется правилам, управляющим другими классами (может наследовать только один класс) при условии, что он не может быть создан (потому что нет гарантии, что он полностью реализован). Может иметь постоянные переменные-члены. Может реализовывать контроль доступа элемента, ограничивая его как protected , private или частный пакет (неуказанный).
  • Обычно используется либо для обеспечения большей части реализации, которая может использоваться несколькими подклассами, либо для обеспечения такой же реализации, какой может предоставить программист.

Или, если мы хотим сварить все до одного предложения: interface - это класс реализации, но класс abstract - это подкласс.

3
ответ дан Justin Time 29 янв. '16 в 0:58 2016-01-29 00:58

Различия между абстрактным классом и интерфейсом от имени реальной реализации.

Интерфейс . Это ключевое слово и используется для определения шаблона или синего цвета объекта, и он заставляет все под-классы следовать одному и тому же прототипу, так как для реализации все подклассы могут свободно выполнять функциональность по требованию.

Некоторые из других случаев использования, где мы должны использовать интерфейс.

Связь между двумя внешними объектами (интеграция сторонних разработчиков в нашем приложении) осуществляется через Интерфейс здесь Интерфейс работает как Контракт.

Абстрактный класс: Аннотация. Это ключевое слово, и когда мы используем это ключевое слово перед любым классом, он становится абстрактным классом. Он в основном используется, когда нам нужно определить шаблон, а также некоторые значения по умолчанию функциональность объекта, за которым следуют все под-классы, и таким образом он удаляет избыточный код и еще один вариант использования, где мы можем использовать абстрактный класс , например, мы не хотим, чтобы другие классы не могли напрямую создавать объект класса, только производные классы могут использовать функциональные возможности.

Пример абстрактного класса:

  public abstract class DesireCar { //It is an abstract method that defines the prototype. public abstract void Color(); // It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels. // and hence no need to define this in all the sub classes in this way it saves the code duplicasy public void Wheel() { Console.WriteLine("Car has four wheel"); } } **Here is the sub classes:** public class DesireCar1 : DesireCar { public override void Color() { Console.WriteLine("This is a red color Desire car"); } } public class DesireCar2 : DesireCar { public override void Color() { Console.WriteLine("This is a red white Desire car"); } } 

Пример интерфейса:

  public interface IShape { // Defines the prototype(template) void Draw(); } // All the sub classes follow the same template but implementation can be different. public class Circle : IShape { public void Draw() { Console.WriteLine("This is a Circle"); } } public class Rectangle : IShape { public void Draw() { Console.WriteLine("This is a Rectangle"); } } 
3
ответ дан Sheo Dayal Singh 16 авг. '17 в 11:43 2017-08-16 11:43

По определению интерфейсы не могут иметь реализацию для любых методов, а переменные-члены не могут быть инициализированы.

Однако абстрактные классы могут реализовывать методы и инициализировать переменные-члены.

Используйте абстрактные классы, когда вы ожидаете изменений в своем контракте, т.е. в будущем вам может потребоваться добавить новый метод.

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

Подробнее читайте разницу между абстрактным классом и интерфейсом

3
ответ дан Ranganatha 19 янв. '15 в 11:59 2015-01-19 11:59

Əsas nöqtələr:

  • Абстрактный класс может иметь свойство, поля данных, методы (полный/ неполный) обе.
  • Если метод или Свойства определяют в абстрактном ключевом слове, которое должно переопределяться в производном классе. (его работа как тесно связанная функциональность)
  • Если определить абстрактное ключевое слово для метода или свойств в абстрактном классе, вы не можете определить тело метода и получить/установить значение для свойства, которые должны переопределяться в производном классе.
  • Xülasə sinfi bir çox mirasçılığı dəstəkləmir.
  • Абстрактный класс содержит конструкторы.
  • Абстрактный класс может содержать модификаторы доступа для подмножеств, функций, свойств.
  • Только полный член абстрактного класса может быть статическим.
  • Интерфейс может наследовать только от другого интерфейса и не может наследовать от абстрактного класса, где абстрактный класс может наследовать от другого абстрактного класса или другого интерфейса.

Преимущество:

  • Это своего рода контракт, который заставляет все подклассы выполнять одни и те же иерархии или стандарты.
  • Если различные реализации имеют один и тот же вид и используют общее поведение или статус, тогда лучше использовать абстрактный класс.
  • Если мы добавим новый метод в абстрактный класс, то у нас есть возможность обеспечить реализацию по умолчанию, и поэтому весь существующий код может работать правильно.
  • Это позволяет быстро выполнить, чем интерфейс. (interface Требуется больше времени для поиска фактического метода в соответствующих классах.)
  • Он может использоваться для жесткой и свободной связи.

найти подробности здесь... http://pradeepatkari.wordpress.com/2014/11/20/interface-and-abstract-class-in-c-oops/

3
ответ дан Pradeep atkari 20 нояб. '14 в 10:55 2014-11-20 10:55

Вы можете найти четкую разницу между интерфейсом и абстрактным классом.

Интерфейс

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

Абстрактный класс

  • Абстрактный класс содержит абстрактные и не абстрактные методы.

  • Не заставляет пользователей внедрять все методы при унаследовании абстрактный класс.

  • Содержит все виды переменных, включая примитивные и непримитивные

  • Объявить использование абстрактного ключевого слова.

  • Методы и члены абстрактного класса могут быть определены с помощью любых видимость.

  • Детский класс может расширять только один класс (абстрактный или конкретный).

3
ответ дан Rahul Chauhan 24 авг. '17 в 17:05 2017-08-24 17:05

Наследование используется для двух целей:

  • Чтобы позволить объекту рассматривать элементы данных родительского типа и реализации методов как свои собственные.

  • Разрешить ссылку на объекты одного типа, которые будут использоваться кодом, который ожидает ссылку на объект супертипа.

В языках/рамках, которые поддерживают обобщенное множественное наследование, часто не нужно классифицировать тип как "интерфейс" или "абстрактный класс". Однако популярные языки и фреймворки позволят типу рассматривать другие члены данных типа или реализации метода как свои собственные, даже если они позволяют заменять тип для произвольного числа других типов.

Абстрактные классы могут иметь элементы данных и реализации методов, но могут наследоваться только классами, которые не наследуются ни от каких других классов. Интерфейсы практически не ограничивают типы, которые их реализуют, но не могут включать в себя какие-либо элементы данных или реализации методов.

Бывают случаи, когда полезно использовать типы для разных вещей; существуют другие случаи, когда полезно, чтобы объекты рассматривали элементы данных родительского типа и реализации методов как свои собственные. Различие между интерфейсами и абстрактными классами позволяет использовать каждую из этих способностей в тех случаях, когда это наиболее актуально.

3
ответ дан supercat 03 сент. '13 в 19:09 2013-09-03 19:09

Абстрактный класс - это класс, объект которого не может быть создан, или класс, который не может быть создан. Абстрактный метод делает класс абстрактным. Абстрактный класс должен быть унаследован, чтобы переопределить методы, объявленные в абстрактном классе. Нет ограничений на спецификаторы доступа. Абстрактный класс может иметь конструктор и другие конкретные (не абзац-методы) методы, но интерфейс не может иметь.

Интерфейс - это шаблон/шаблон методов (например, дается дом на бумаге (дом интерфейса), а разные архитекторы будут использовать свои идеи для его создания (классы архитекторов, реализующие интерфейс дома). Это набор абстрактных методов, методов по умолчанию, статических методов, конечных переменных и вложенных классов. Все участники будут либо окончательными, либо публичными, защищенными и частными спецификаторами доступа. Запрещено создание объекта. Класс должен быть создан для использования интерфейса реализации, а также для переопределения абстрактного метода, объявленного в интерфейсе. Интерфейс является хорошим примером свободной связи (динамический полиморфизм/динамическое связывание) Интерфейс реализует полиморфизм и абстракцию. Он рассказывает, что делать, но как это сделать, определяется классом реализации. Напр. Там есть автомобильная компания, и она хочет, чтобы некоторые функции были одинаковыми для всего автомобиля, который он производит, поэтому для этого компания будет создавать интерфейсный автомобиль, который будет иметь эти функции и различные классы автомобилей (например, Maruti Suzkhi, Maruti 800). переопределить эти функции (функции).

Почему интерфейс, когда у нас уже есть абстрактный класс? Java поддерживает только многоуровневое и иерархическое наследование, но с помощью интерфейса мы можем реализовать множественное наследование.

2
ответ дан Tutu Kumari 20 сент. '16 в 22:12 2016-09-20 22:12

Чтобы дать простой, но понятный ответ, он помогает установить контекст: вы используете оба варианта, когда не хотите предоставлять полные реализации.

Основное отличие заключается в том, что интерфейс вообще не имеет реализации (только методы без тела), в то время как абстрактные классы могут также иметь элементы и методы с телом, то есть могут быть частично реализованы.

2
ответ дан user3775501 28 июня '17 в 13:49 2017-06-28 13:49
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос