Interface vs mücərrəd sinif (generic OO)

Bu yaxınlarda mən iki telefon danışıqları keçirdim və mənə arayış və mücərrəd sinif arasındakı fərqlər barədə soruşdum. Mən düşünə biləcəyim bütün aspektləri izah etdim, amma onlar mənə xüsusi bir şey söyləməyi gözləyirlər və mən bunun nə olduğunu bilmirəm.

Təcrübəmdə aşağıdakıları nəzərdən keçirirəm. Bir itkin nöqtə varsa, mənə bildirin.

İnterfeys:

Bir interfeysdə bəyan edilən hər bir üsul bir alt sinifdə tətbiq edilməlidir. Arayda yalnız hadisələr, nümayəndələr, xüsusiyyətlər (C #) və üsullar mövcud ola bilər. Bir sinif bir neçə interfeys tətbiq edə bilər.

Xülasə sinfi:

A subclass yalnız soyut üsulları yerinə yetirməlidir. Xülasə sinfi tətbiqlərlə normal üsullara malik ola bilər. Mücərrəd sinif də hadisələrin, nümayəndələrin, xüsusiyyətlərin və üsulların yanında sinif dəyişənlərinə malik ola bilər. C sinf yalnız C # -də birdən çox miras olmaması səbəbindən yalnız bir mücərrəd sinfi həyata keçirə bilər.

  • Bundan sonra, müsahibə "Soyut üsullarla abstrakt bir sinif varsa, bu interfeysdən necə fərqlənir?" Sualını verdi. Cavabımı bilmirdim, amma düşünürəm ki, bu miras yuxarıda göstərildiyi kimi düzgündür?

  • Digər bir müsahibə məndən soruşdu ki, interfeys içərisində bir ictimai dəyişən varsa, bu necə bir mücərrəd sinifdən fərqlənir? Mən arayış içərisində ictimai bir dəyişən ola bilməyəcəyini təkid edirdim. Mən eşitmək istədiyimi bilmirdim, amma o da razı qalmadı.

Həmçinin baxın :

1212
17 апр. Houman tərəfindən 17 Mart tarixində təyin olundu 2009-04-17 19:42 '09 da 7:42 pm 2009-04-17 19:42
@ 35 cavab
  • 1
  • 2

Sualınız "generic OO" -a işarə etdiyiniz müddətcə, bu, bu .NET şərtlərindən istifadə etməyə diqqət yetirir.

.NET-də (Java-a oxşar):

  • interfeys dövlətə və ya tətbiqə malik ola bilməz
  • interfeysi tətbiq edən sinif bu interfeysin bütün metodlarının tətbiqini təmin etməlidir
  • mücərrəd siniflər dövlət (məlumat elementləri) və / və ya tətbiq (üsullar)
  • mücərrəd dərslər abstrakt metodlar tətbiq etmədən miras alınmaqla mümkündür (baxmayaraq ki, belə törəmə bir sinif mücərrəddir)
  • interfeyslər çoxlu miras ola bilər, mücərrəd dərslər ola bilməz (bu, yəqin ki, interfeyslərin sərbəstlikdən imtina edən siniflərdən fərqli olaraq mövcud olduğuna dair bir əsas səbəbdir - onlar bir çox ümumi problemlərin aradan qaldırılmasına səbəb olan çoxlu miraslara imkan verir).

OO-nun ümumi üzvləri kimi fərqlər mütləq aydın şəkildə müəyyən edilmir. Məsələn, C ++ proqramçıları buna bənzərsiz sərhəd tanımlamalarına (interfeyslər bir tətbiqə malik olmayan abstrakt siniflərin sıx alt kəmiyyətidir) bağlıdırlar, bəziləri bəzi default tətbiqləri olan abstrakt bir sinif hələ də bir interfeys və ya heç bir mücərrəd sinif hələ bir interfeys müəyyən edə bilməz.

Həqiqətən, ictimai metodlar xüsusi virtual üsullar üçün "thunk" olan virtual üsullar deyildir ki, qeyri-virtual interfeys (NVI) adlanan C ++ deyimi var:

639
17 апр. Maykl Burr tərəfindən verilmiş cavabı Apr 17 2009-04-17 20:18 '09 saat 20:18 'da 2009-04-17 20:18

Analoji vəziyyətlər haqqında: Hava qüvvələrində olduğum zaman pilot təlimlərinə getdim və ABŞ Hava Qüvvələri üçün pilot oldum. O anda mən heç bir şeyə uçmayıb təyyarədə öyrənməyə məcbur oldum. Mən ixtisaslı olduğum müddətdə pilot (Abstract class) və C-141 pilotu (xüsusi sinif) oldum. Vəzifələrimdən birində mənə əlavə vəzifə verildi: təhlükəsizlik işçisi. İndi hələ C-141 pilotu və pilotu oldum amma təhlükəsizlik vəzifəlisi olaraq da vəzifə yerinə yetirdim (söz mövzusu ISafetyOfficer tətbiq etdim). Pilot təhlükəsizlik işçisi olmadı, digər insanlar da bunu edə bilərdi.

Bütün ABŞ Hava Qüvvələri pilotları bəzi Hava Qüvvələri qaydalarına riayət etməlidirlər və bütün C-141 pilotları (və ya F-16 və ya T-38) "ABŞ Hava Qüvvələri pilotlarıdır". Hər kəs təhlükəsizlik işçisi ola bilər. Xülasə edək:

border=0
  • Pilot: mücərrəd sinif
  • C-141 Pilot: xüsusi sinif
  • ISafety işçisi: interfeys

Əlavə edilmiş qeyd: bu kodlaşdırma tövsiyəsini deyil, konsepsiyanı izah etməyə kömək etmək üçün bir oxşarlıq olmalıdır. Aşağıdakı müxtəlif şərhlərə baxın, müzakirə maraqlıdır.

760
30 авг. Cavab 30 avqust tarixində Jay tərəfindən verilir . 2010-08-30 07:40 '10 saat 07:40 'da 2010-08-30 07:40

Mən istədiyim cavabın əsas və ya OPPS-fəlsəfi bir fərq olduğunu düşünürəm.

Soyut sinif mirasçılığı, türetilmiş sinif mücərrəd sinifin əsas xüsusiyyətlərini və davranışını ayırdıqda istifadə olunur. Həqiqətən, sinfi müəyyən edən davranış növü.

Digər tərəfdən, dərslik mirasçılığı siniflər, törəmə bir sinfi mütləq təyin etməyən periferik davranışın payına düşdükdə istifadə olunur.

Məsələn, bir avtomobil və yük maşını bir avtomobildən mücərrəd sinifin əsas xüsusiyyətləri və davranışlarından bir çoxunu paylaşıblar, ancaq onlar da Motorlar və ya PowerGeneratorlar kimi qeyri-avtomobil sinifləri belə bir avtomobil və ya yük maşını təyin etməyəcəklər, belə ki, egzoz istehsalı kimi bəzi ətraf mühit davranışlarını bölüşürlər Avtomobil, Truck, Driller və PowerGenerator eyni IExhaust interfeysindən istifadə edə bilər.

194
31 авг. Cavab Prasun 31 avqustda verilir . 2011-08-31 15:09 '11 at 15:09 2011-08-31 15:09

Qısa: mücərrəd dərslər oxşar siniflərin sinif hiyerarşisini simulyasiya etmək üçün istifadə olunur (məsələn, heyvan soyuq bir sinif ola bilər və İnsan, Aslan, Tiger konkret törəmə siniflər ola bilər)

İnterfeys interfeysi həyata keçirən interfeysin növü ilə maraqlanmayan iki oxşar / fərqli sinif arasındakı ünsiyyət üçün istifadə olunur (məsələn, Height bir interfeys ola bilər və İnsan, Bina, Ağac tətbiq edilə bilər. üzmək, ölmək və ya başqa bir şey edə bilərsiniz .. Bütün bunlar, hündürlüyə (sinifdə tətbiq) ehtiyacınız olmasıdır.

168
05 апр. Cavab Dhananjay tərəfindən verilir 05 Apr 2012-04-05 12:53 '12 at 12:53 2012-04-05 12:53

Bir neçə fərqlilik var -

Arayüzlər xüsusi tətbiqlərə malik ola bilməz. Abstract əsas siniflər ola bilər. Bu, orada xüsusi proqramları təmin etməyə imkan verir. Bu interfeys həqiqətən yalnız sinifin necə istifadə edildiyini təsvir edirsə, mücərrəd baza sinifinin həqiqətən daha sərt bir müqavilə təmin etməsinə icazə verə bilər. (Soyut baz sinifində baz sinifinin müəllifinə daha çox nəzarət verən qeyri-virtual üzvlər ola bilər.)

Bir sinifdə bir neçə interfeys tətbiq edilə bilər. Bir sinif yalnız bir abstrakt əsas sinifdən əldə edilə bilər. Bu, interfeyslər istifadə edərək, polimorfik bir iyerarxiya istifadə etməyə imkan verir, lakin mücərrəd baza sinfləri deyil. Bundan əlavə, interfeyslərdən istifadə edərək yalançı-çoxlu mirasın istifadəsinə imkan verir.

Xülasə bazası sinifləri API-yı silmədən v2 + olaraq dəyişdirilə bilər. Interfeyslərdəki dəyişikliklər dəyişiklikləri pozur.

[C # / .NET Specific] İnterfeys, abstrakt baz siniflərindən fərqli olaraq, dəyər növlərinə (structs) tətbiq edilə bilər. Strukturların mücərrəd bazlı siniflərdən miras alınması mümkün deyil. Bu dəyər növləri üçün davranış müqavilələri / istifadə qaydalarını tətbiq etməyə imkan verir.

74
17 апр. Cavab Reed Copsey tərəfindən verilir 17 Aprel 2009-04-17 19:46 '09 da 19:46 2009-04-17 19:46

miras
Bir avtomobil və bir avtobus düşünün. Bunlar iki fərqli avtomobillərdir. Lakin hələ də sükan, əyləc, dişli, mühərrik və s. Kimi ümumi xüsusiyyətləri var.
Beləliklə, miras anlayışı ilə aşağıdakı kimi təmsil edilə bilər ...

 public class Vehicle { private Driver driver; private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) > 

İndi velosiped ...

 public class Bicycle extends Vehicle { //You define properties which are unique to bicycles here ... private Pedal pedal; } 

Və avtomobil ...

 public class Car extends Vehicle { private Engine engine; private Door[] doors; } 

Bu, bütün Miras haqqında. Biz onları yuxarıda gördüklərimiz kimi sadə əsas formalarda və onların uşaqlarında təsnif etmək üçün istifadə edirik.

Soyut dərslər

Xülasə dərsləri natamam obyektlərdir. Bunu anlamaq üçün bir dəfə vasitə ilə analoji düşünün.
Avtomobil sürülə bilər. Sağ olsun? Ancaq fərqli nəqliyyat vasitələri fərqli olaraq idarə olunur ... Məsələn, bir velosipedlə gəzinti etdiyiniz kimi bir avtomobili idarə edə bilməzsiniz.
Belə ki, vasitənin sürücüsünün funksiyasını necə təqdim etmək olar? Nə cür avtomobil olduğunu yoxlamaq və öz funksiyasını yoxlamaq çətindir; Yeni bir nəqliyyat vasitəsi əlavə edərkən sürücü sinifini təkrar-təkrar dəyişdirməlisiniz.
Burada abstrakt siniflərin və üsulların rolu gəlir. Disk üsulunu irs olaraq qəbul edən hər bir uşaq bu funksiyanı yerinə yetirməlidir.
Buna görə, əgər avtomobilin sinfini dəyişdirsəniz ...

 //......Code of Vehicle Class abstract public void drive(); //.....Code continues 

Velosiped və avtomobil də onu necə idarə edəcəklərini göstərməlidir. Əks halda kod tərtib edilməyəcək və bir səhv göstərilir.
Bir sözlə, mücərrəd sinif qismən natamam funksiyaları ilə tamamlanmamışdır ki, uşaqları miras etməlidirlər.

Arayüzlər Arayüzlər tamamilə tamamlanmamışdır. Onların heç bir xüsusiyyətləri yoxdur. Onlar sadəcə uşaqların miras alınması üçün bir şey edə biləcəyini göstərirlər ...
Fərqli cib telefonu tipləriniz var. Hər birinin müxtəlif funksiyaları yerinə yetirmək üçün müxtəlif yolları var; Məsələn: bir insanı axtarın. Telefon istehsalçısı bunu necə edəcəyini göstərir. Burada mobil telefonlar bir nömrə yığa bilər, yəni. Nömrəni yığın. Bunu bir interfeys olaraq düşünün.

 public interface Dialable { public void dial(Number n); } 

Burada dialifanın yaradıcısı bir nömrə yığmağı müəyyənləşdirir. Yalnız ona yığmaq üçün bir sıra verməlisiniz.

 // Makers define how exactly dialable work inside. Dialable PHONE1 = new Dialable() { public void dial(Number n) { //Do the phone1 own way to dial a number } } Dialable PHONE2 = new Dialable() { public void dial(Number n) { //Do the phone2 own way to dial a number } } //Suppose there is a function written by someone else, which expects a Dialable ...... public static void main(String[] args) { Dialable myDialable = SomeLibrary.PHONE1; SomeOtherLibrary.doSomethingUsingADialable(myDialable); } ..... 

Beləliklə, mücərrəd siniflər əvəzinə interfeys istifadə edərək, Dialable istifadə edən bir funksiyanı yazıçı onun xüsusiyyətləri barədə narahatlığa ehtiyac yoxdur. Misal: bir toxunma ekranı və ya yığma pad varmı, bu sabit telefonda və ya cib telefonu. Yalnız mövcud olub olmadığını bilmək lazımdır; Dialable interfeysini devralır (və ya tətbiq edir).

Və bundan da daha önəmlisi, əgər siz başqa bir dialable keçirmisinizsə

 ...... public static void main(String[] args) { Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2 SomeOtherLibrary.doSomethingUsingADialable(myDialable); } ..... 

Kodun hələ də işlədiyinə əmin ola bilərsiniz, çünki keçiddən istifadə edən funksiya (və mümkün deyil) Dialable interfeysində göstərilənlərdən fərqli olan hissələrə asılı deyildir. Hər ikisi də Dialable interfeysi həyata keçirir və bu, funksiyaya diqqət yetirən yeganə şeydir.

Arayüzlər, ümumi funksiyaya sahib olduqları üçün, obyektlər arasında qarşılıqlı əlaqəni (bir-birinə dəyişdirmək üçün) inkişaf etdirənlər tərəfindən istifadə olunur (bir nömrə yığmaq lazımdır ki, bir stasionar və ya mobil telefona keçid kimi). Bir sözlə, interfeyslər heç bir xüsusiyyət olmadan mücərrəd siniflərin daha sadə bir versiyasıdır.
Həmçinin istədiyiniz kimi çox arayüzlər tətbiq edə bilərsiniz (inherit), ancaq bir valideyn sinifini (devralın) yalnız genişləndirə bilərsiniz.

Daha ətraflı məlumat Abstract classes vs Interfaces

63
14 июня '13 в 16:11 2013-06-14 16:11 Cavab fz_salam 14 iyun 14: 13-da verilir 2013-06-14 16:11

Bu soruyu cavablandırmaq üçün java dili OOP dili olaraq görürsünüzsə, Java 8-in buraxılması yuxarıda göstərilən cavabların bir qismini köhnəlmiş edir. İndi java interfeysi müəyyən bir tətbiq ilə default üsulları ola bilər.

Oracle site interfaceabstract sinif arasında əsas fərqlər təmin edir.

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

  1. Bir neçə yaxından əlaqəli dərslər arasında kod paylaşmaq istəyirsən.
  2. Soyuducu sinifinizi genişləndirən dərslər bir çox ümumi metod və ya sahələrə malikdir və ya ictimai olanlardan başqa (məsələn, qorunan və özəl) çıxış modifikatorları tələb edir.
  3. Statik olmayan və qeyri-son sahələri elan etmək istəyirsiz.

Aşağıdakı hallarda interfeyslərdən istifadə etməyi düşünün :

  1. 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.
  2. Belirli bir veri türünün davranışını belirtmek istersiniz, ancaq davranışını kimin uyguladığıyla ilgilenmiyorsunuz.
  3. Birdən çox növü miras istifadə etmək istəyirik.

Sadəcə qoyub istifadə etmək istərdim

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

Anlamaq üçün nümunə koduna bir şeyləri başa düşün: bir interfeys və mücərrəd sinif arasındakı fərqləri necə izah etməliyəm?

34
27 нояб. Cavab Ravindra Babu 27 Noyabrda verilir. 2015-11-27 22:20 '15 at 10:20 pm 2015-11-27 22:20

Müsahibələr bir qəribə ağac büküb. C # və Java kimi dillər üçün fərq var, lakin digər dillərdə, məsələn, C ++, no. OO teorisi bu ikidən fərqli deyil, sadəcə dilin sintaksisidir.

Mücərrəd sinif, irəliləyiş ediləcək tətbiq və interfeys (təmiz virtual üsullar) olan bir sinifdir. Arayüzlər adətən heç bir tətbiqə malik deyil, yalnız təmiz virtual funksiyaları.

C # və ya Java'da heç bir tətbiqi olmadan mücərrəd sinif interfeysdən yalnız onu devralmaq üçün istifadə olunan sintaksisdən fərqlənir və yalnız birinə sahib ola bilərsiniz.

30
17 апр. 17 Aprel tarixində Steve Rowe tərəfindən cavablandırıldı 2009-04-17 19:48 '09 at 7:48 PM 2009-04-17 19:48

İnterfeys istifadə edərək, mirasın əvəzinə bir kompozisiya ("has-a") əldə edirsiniz (bu, bir əlaqəsidir). Dizayn nümunələri, məsələn, kompozisiya davranışına nail olmaq üçün miras deyil, interfeyslərdən istifadə etmək lazım olan şeylərə gəldikdə yadda saxlamaq vacibdir.

29
17 апр. Cavab TheTXI tərəfindən verilir Apr 17 2009-04-17 19:52 '09 da 19:52 'da 2009-04-17 19:52

İnterfeys dərinliyi və mücərrəd sinif haqqında ətraflı məlumat verəcəyəm. İnterfeys və mücərrəd sinifin ümumi məlumatını bilirsinizsə, o zaman ilk sual interfeysi istifadə edərkən və abstrakt sinfi istifadə edərkən ağla gəlir. Buna görə, aşağıdakı interfeys və mücərrəd sinif təsvirini yoxlayın.

  • İnterfeyni nə vaxt istifadə etməliyik?

    Əgər həyata keçirilməzdən xəbərdar deyilsinizsə, biz tələblərin dəqiqləşdirilməsinə sahibik, sonra interfeyslə gedirik

  • Soyqrın bir sinfi nə vaxt istifadə etməliyik?

    Əgər həyata keçirildiyini bilirsinizsə, ancaq tamamilə (qismən yerinə yetirilmirsinizsə), sonra Soyut sinifə keçin.

    İnterfeys

    Hər bir metod ictimai xülasə deməkdir ki, interfeys abstrakt mücərrəddir 100%.

    Xülasə

    bir abstrakt sinifdə tətbiq olunan Beton metodu və Abstrakt metodu ola bilən bir Beton metodu və Soyut bir metod ola bilər, Soyut sinif soyut olaraq elan edilmiş bir sinifdir - soyut üsulları ehtiva edə bilər və ya daxil edə bilməz.

    İnterfeys

    Interfeyni qapalı, qorunan kimi elan edə bilmirik

    Q. Niyə biz fərdi və qorunan interfeysi bəyan etmirik?

    Varsayılan interfeys metodu ictimaiyyətə aid deyil və buna görə də biz fərdi və qorunan interfeysimizi elan etmirik.

    İnterfeys metodu
    nə interfeysi qapalı, qorunan, son, statik, senkronize, doğma olaraq elan edə bilərik .....

    Bir səbəb verəcəyəm: niyə biz sinxronlaşdırılmış bir metodu bəyan etmirik? Çünki biz bir interfeys obyektini yarada bilmərik və bu kimi bir obyekt üzərində işi sinxronlaşdıra bilmərik və oğlumuz sinxronlaşdırılmış bir üsul elan etməyimizi müdafiə edir.

    Xülasə

    biz məmnuniyyətlə ictimai istifadə, son statik bağlan ... məhdudiyyət mücərrəd şəklində tətbiq edilə bilməz deməkdir.

    İnterfeys

    Dəyişənlər default olaraq ictimai statik yekun kimi interfeysdə elan edilir, belə ki, biz də gizli, qorunan bir dəyişən elan etmirik.

    Varsayılan interfeys dəyişəninin statik yekun və yekun dəyişən olduğu halda dəyişən dəyişən interfeysdə də tətbiq edilmir, bir dəyişənə dəyər verildikdən sonra dəyəri dəyişdirə bilməzsiniz və bir dəyişən elan etdikdən sonra dəyişən təyin etməlisiniz.

    Və dəyişkən dəyişən dəyişiklikləri saxlayır, əksinə. sona çatdıqda, bu interfeysdə dəyişkən dəyişən istifadə etməyin səbəbidir.

    Xülasə

    Müstəsna dəyişənin ictimai statik yekun bəyan etməsi lazım deyil.

Bu məqalənin faydalı olacağına ümid edirəm.

23
31 мая '14 в 9:33 2014-05-31 09:33 Cavab YegsVala tərəfindən 31 May 'da 9:33' də veriləcək 2014-05-31 09:33

Net üçün,

İkinci müsahibə verdiyiniz cavabı da ilk cavabdır ... Abstract dərsləri bir reallaşdırma ola bilər və dövlət, interfeyslər ...

EDIT: Başqa qeyddə, interfeysin "həyata keçirilməsi üçün müəyyən edilmiş" dərsləri təsvir etmək üçün "subclass" (və ya "miras") ifadəsini istifadə etmirəm. Mənim üçün bir interfeys, bu interfeysi həyata keçirmək üçün müəyyən edilmişsə, bir sinifə uyğun bir müqavilənin tərifidir. Heç bir şey devralmır ... Hər şeyi özünüzə əlavə etməliyəm, açıqca.

21
17 апр. Apr 17-də Charles Bretan tərəfindən verilmiş cavab 2009-04-17 19:48 '09 at 7:48 PM 2009-04-17 19:48

Konkret olaraq, birinə və ya hər ikisinə istifadə edərək, dilə uyğun bir tətbiqin, qaydaların, üstünlüklərin və hər hansı bir proqramlaşdırma məqsədi əldə olunmasının qorunması kod / data / əmlak, blah blah, birdəfəlik və ya birdən çox miras ola bilər və ya ola bilməz kənar

1- Аннотация (или чистый абстрактный) класс предназначен для реализации иерархии. Если ваши бизнес-объекты выглядят несколько структурно похожими, представляя родство с родительским (иерархическим) видом отношений, то будут использоваться только классы наследования/абстракции. Если ваша бизнес-модель не имеет иерархии, тогда наследование не должно использоваться (здесь я не говорю о логике программирования, например, некоторые шаблоны проектирования требуют наследования). Концептуально абстрактный класс - это метод реализации иерархии бизнес-модели в ООП, он не имеет ничего общего с интерфейсами, фактически сравнение абстрактного класса с интерфейсом бессмысленно, потому что оба концептуально совершенно разные вещи, в опросах попросят просто проверить потому что он выглядит как обеспечивающий несколько одинаковые функциональные возможности при реализации, и мы, программисты, обычно подчеркиваем больше о кодировании. [Имейте это в виду, что абстракция отличается от абстрактного класса].

2- Интерфейс - это контракт, полная функциональность бизнеса, представленная одним или несколькими наборами функций. Вот почему он реализован и не унаследован. Бизнес-объект (часть иерархии или нет) может иметь любое количество функциональных возможностей. Он не имеет ничего общего с абстрактными классами, т.е. означает наследование в целом. Например, человек может RUN, слон может RUN, птица может RUN и т.д., Все эти объекты различной иерархии будут реализовывать интерфейс RUN или интерфейс EAT или SPEAK. Не входите в реализацию, поскольку вы можете реализовать ее как имеющую абстрактные классы для каждого типа, реализующего эти интерфейсы. Объект любой иерархии может иметь функциональность (интерфейс), которая не имеет ничего общего с ее иерархией.

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

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

Я считаю, что оба интервьюера ожидали одной прямой прямой разницы между этими двумя, и когда вы потерпели неудачу, они попытались подтолкнуть вас к этой разнице, реализовав ОДИН как ДРУГОЙ

Что делать, если у вас был абстрактный класс с абстрактными методами?

21
ответ дан bjan 23 янв. '12 в 14:43 2012-01-23 14:43

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

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

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

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

15
ответ дан Gnucki 05 дек. '14 в 13:38 2014-12-05 13:38
 After all that, the interviewer came up with the question "What if you had an Abstract class with only abstract methods? How would that be different from an interface?" 

Docs ясно говорят, что если абстрактный класс содержит только объявления абстрактного метода, он должен быть объявлен как интерфейс.

 An another interviewer asked me what if you had a Public variable inside the interface, how would that be different than in Abstract Class? 

Переменные в интерфейсах по умолчанию являются public static и final. Вопрос может быть сформулирован так, как если бы все переменные в абстрактном классе были общедоступными? Ну, они все равно могут быть не статичными и несинтевыми, в отличие от переменных в интерфейсах.

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

11
ответ дан Aniket Thakur 20 авг. '13 в 15:34 2013-08-20 15:34

Скопировано из CLR через С# Джеффри Рихтером...

Я часто слышу вопрос: "Должен ли я создать базовый тип или интерфейс?" Ответ не всегда clearcut.

Вот некоторые рекомендации, которые могут вам помочь:

■■ Отношение IS-A к CAN-DO Тип может наследовать только одну реализацию. Если полученная тип can not требует отношения IS-A с базовым типом, не использует базовый тип; используйте интерфейс. Интерфейсы подразумевают связь CAN-DO. Если функция CAN-DO, по-видимому, принадлежит с различными типами объектов, используйте интерфейс. Например, тип может преобразовывать собственные экземпляры к другому типу (IConvertible), тип может сериализовать экземпляр самого себя (ISerializable), и т.д. Обратите внимание, что типы значений должны быть получены из System.ValueType, и поэтому они не могут быть производным от произвольного базового класса. В этом случае вы должны использовать связь CAN-DO и определите интерфейс.

■■ Простота использования. Как правило, вам как разработчику проще определить новый тип, полученный из базового типа, чем реализовать все методы интерфейса. Базовый тип может обеспечить много функциональности, поэтому производный тип, вероятно, нуждается только в относительно небольших модификациях в своем поведении. Если вы предоставляете интерфейс, новый тип должен реализовывать все члены.

■■ Последовательная реализация Независимо от того, насколько хорошо документирован контракт на интерфейс, его очень маловероятно, что каждый выполнит контракт на 100 процентов правильно. Фактически, COM страдает от этой самой проблемы, поэтому некоторые COM-объекты работают корректно только с Microsoft Word или с Windows Internet Explorer. Предоставляя базовый тип с хорошим по умолчанию, вы начинаете использовать тип, который работает и хорошо протестирован; вы можете тогда изменить детали, которые нуждаются в модификации.

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

11
ответ дан Deepak Mishra 21 апр. '14 в 22:34 2014-04-21 22:34

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

Плюсы:

  1. Позволяет множественное наследование
  2. Предоставляет абстракцию, не раскрывая, какой именно объект используется в контексте
  3. обеспечивает согласованность конкретной подписью контракта

Минусы:

  1. Необходимо реализовать все определенные контракты
  2. Не может быть переменных или делегатов
  3. После определения невозможно изменить без нарушения всех классов

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

Плюсы:

  1. Быстрее, чем интерфейс
  2. Имеет гибкость в реализации (вы можете реализовать ее полностью или частично)
  3. Может быть легко изменено без разбиения производных классов

Минусы:

  1. Невозможно создать экземпляр
  2. Не поддерживает множественное наследование
10
ответ дан bourax webmaster 14 авг. '14 в 13:27 2014-08-14 13:27
  • Интерфейс:
    • Мы не реализуем (или определяем) методы, мы делаем это в производных классах.
    • Мы не объявляем переменные-члены в интерфейсах.
    • Интерфейсы выражают связь HAS-A. Это означает, что они являются маской объектов.
  • Абстрактный класс:
    • Мы можем объявлять и определять методы в абстрактном классе.
    • Мы скрываем его конструкторы. Это означает, что из него не создается никакого объекта.
    • Абстрактный класс может содержать переменные-члены.
    • Производные классы наследуют абстрактный класс, который означает, что объекты из производных классов не маскируются, он наследует абстрактный класс. Связь в этом случае - IS-A.

Это мое мнение.

10
ответ дан nautilusvn 23 окт. '11 в 12:00 2011-10-23 12:00

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

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

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

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

  • Интерфейс Java должен быть реализован с использованием ключевого слова "инструменты"; Абстрактный класс Java должен быть расширен с использованием ключевого слова "extends".

  • Интерфейс может расширить только другой интерфейс Java, абстрактный класс может расширить другой класс Java и реализовать несколько интерфейсов Java.

  • Java-класс может реализовывать несколько интерфейсов, но может расширять только один абстрактный класс.

  • Интерфейс абсолютно абстрактен и не может быть создан; Явный абстрактный класс также не может быть создан, но может быть вызван, если существует main().

  • По сравнению с абстрактными классами Java, java-интерфейсы медленны, так как требуют дополнительной косвенности.

10
ответ дан Mudasir Bhutto 14 февр. '13 в 23:00 2013-02-14 23:00

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

Интерфейс - это соглашение . Он указывает: "так мы будем разговаривать друг с другом". Он не может иметь никакой реализации, поскольку он не должен иметь никакой реализации. Это контракт. Это как заголовочные файлы .h в C.

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

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

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

9
ответ дан mcv 08 апр. '14 в 15:07 2014-04-08 15:07

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

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

С# также позволяет наследовать интерфейс.

8
ответ дан joelmdev 05 окт. '13 в 0:11 2013-10-05 00:11

Как вы могли бы получить теоретические знания от экспертов, я не трачу много слов на повторение всех здесь, а позвольте мне объяснить с помощью простого примера, где мы можем использовать/не можем использовать Interface и Abstract class .

Учтите, что вы разрабатываете приложение для перечисления всех функций автомобилей. В разных точках вам необходимо наследовать, так как некоторые свойства, такие как DigitalFuelMeter, Air Conditioning, регулировка сиденья и т.д., Являются общими для всех автомобилей. Аналогично, нам нужно наследование для некоторых классов только в том случае, если некоторые из свойств, таких как тормозная система (ABS, EBD), применимы только для некоторых автомобилей.

Ниже класс действует как базовый класс для всех автомобилей:

 public class Cars { public string DigitalFuelMeter() { return "I have DigitalFuelMeter"; } public string AirCondition() { return "I have AC"; } public string SeatAdjust() { return "I can Adjust seat"; } } 

Рассмотрим, что у каждого отдельного класса есть отдельный класс.

 public class Alto : Cars { // Have all the features of Car class } public class Verna : Cars { // Have all the features of Car class + Car need to inherit ABS as the Braking technology feature which is not in Cars } public class Cruze : Cars { // Have all the features of Car class + Car need to inherit EBD as the Braking technology feature which is not in Cars } 

Считаем, что нам нужен метод наследования технологии торможения для автомобилей Verna и Cruze (неприменимо для Alto). Хотя оба используют технологию торможения, "технология" отличается. Таким образом, мы создаем абстрактный класс, в котором метод будет объявлен как абстрактный, и он должен быть реализован в его дочерних классах.

 public abstract class Brake { public abstract string GetBrakeTechnology(); } 

Теперь мы пытаемся наследовать этот абстрактный класс, а тип тормозной системы реализован в Verna и Cruze:

 public class Verna : Cars,Brake { public override string GetBrakeTechnology() { return "I use ABS system for braking"; } } public class Cruze : Cars,Brake { public override string GetBrakeTechnology() { return "I use EBD system for braking"; } } 

См. проблему в двух предыдущих классах? Они наследуют от нескольких классов, которые С#.Net не позволяет даже при том, что метод реализован в дочерних элементах. Здесь возникает потребность в интерфейсе.

 interface IBrakeTechnology { string GetBrakeTechnology(); } 

И реализация приведена ниже:

 public class Verna : Cars, IBrakeTechnology { public string GetBrakeTechnology() { return "I use ABS system for braking"; } } public class Cruze : Cars, IBrakeTechnology { public string GetBrakeTechnology() { return "I use EBD system for braking"; } } 

Теперь Verna и Cruze могут добиться множественного наследования с помощью своих технологий торможения с помощью интерфейса.

8
ответ дан Sarath Avanavu 13 нояб. '14 в 6:07 2014-11-13 06:07

Абстрактный класс и разница в интерфейсе:

  • Абстрактный класс может иметь абстрактные и не абстрактные методы, а интерфейс может иметь только абстрактные методы.
  • Абстрактный класс не поддерживает множественное наследование. Интерфейс поддерживает множественное наследование.
  • Абстрактный класс может иметь конечные, не конечные, статические и нестатические переменные. Интерфейс имеет только статические и конечные переменные.
  • Абстрактный класс может иметь статические методы, основной метод и конструктор. Интерфейс не может иметь статические методы, основной метод или конструктор.
  • Абстрактный класс может обеспечить реализацию интерфейса. Интерфейс не может обеспечить реализацию абстрактного класса.
  • Ключевое слово abstract используется для объявления абстрактного класса И Ключевое слово интерфейса используется для объявления интерфейса.
  • Абстрактный класс достигает частичной абстракции (от 0 до 100%), потому что в абстрактном классе также существуют абстрактные методы, тогда как интерфейс достигает полной абстракции (100%).
8
ответ дан Roopam 11 апр. '15 в 18:52 2015-04-11 18:52

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

7
ответ дан fastcodejava 19 янв. '10 в 8:48 2010-01-19 08:48

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

2) Вы можете определить свойство в интерфейсе, поэтому класс, реализующий этот интерфейс, должен иметь это свойство.

Məsələn:

  public interface IVariable { string name {get; set;} } 

Класс, реализующий этот интерфейс, должен иметь такое свойство.

6
ответ дан MRFerocius 17 апр. '09 в 19:50 2009-04-17 19:50

Ответ на второй вопрос: public переменная, определенная в interface , static final по умолчанию, тогда как переменная public в классе abstract является переменной экземпляра.

5
ответ дан Nidhi Agarwal 05 окт. '09 в 15:03 2009-10-05 15:03

Хотя этот вопрос довольно старый, я хотел бы добавить еще один аргумент в пользу интерфейсов:

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

5
ответ дан paragy 26 авг. '12 в 1:22 2012-08-26 01:22

Из другого моего ответа , в основном касающегося того, когда использовать один и другой:

По моему опыту, интерфейсы лучше используется, когда у вас есть несколько классов каждый из которых должен реагировать на одно и то же метода или методов, чтобы они могли быть используется взаимозаменяемо другим кодом которые будут классов. Лучший использование интерфейса - это когда протокол имеет важное значение, но базовая логика может отличаться для каждый класс. Если бы вы были в противном случае дублирующая логика, рассмотрим абстрактную классы или наследование стандартного класса вместо этого.

5
ответ дан Adam Alexander 17 апр. '09 в 19:48 2009-04-17 19:48

Типы интерфейсов и абстрактные базовые классы

Адаптировано из Pro С# 5.0 и .NET 4.5 Framework .

Тип интерфейса может показаться очень похожим на абстрактный базовый класс. Отзыв что когда класс помечен как абстрактный, он может определять любое количество абстрактных членов для предоставления полиморфный интерфейс ко всем производным типам. Однако, даже если класс определяет набор абстрактных членов, он также может определять любое количество конструкторов, полевых данных, неабстрактных членов (с реализация) и т.д. С другой стороны, интерфейсы содержат только абстрактные определения членов. Полиморфный интерфейс, созданный абстрактным родительским классом, страдает одним основным ограничением в том, что только производные типы поддерживают члены, определенные абстрактным родителем. Однако в более крупных программных систем, очень часто разрабатывается несколько иерархий классов, у которых нет общих родительских за пределами System.Object. Учитывая, что абстрактные члены в абстрактном базовом классе применяются только к производным типов, у нас нет способа настроить типы в разных иерархиях для поддержки одного и того же полиморфного интерфейс. В качестве примера предположим, что вы определили следующий абстрактный класс:

 public abstract class CloneableType { // Only derived types can support this // "polymorphic interface." Classes in other // hierarchies have no access to this abstract // member. public abstract object Clone(); } 

Учитывая это определение, только члены, расширяющие CloneableType, могут поддерживать Clone() метод. Если вы создаете новый набор классов, которые не распространяют этот базовый класс, вы не можете его получить полиморфный интерфейс. Кроме того, вы можете вспомнить, что С# не поддерживает множественное наследование для классов. Поэтому, если вы хотите создать MiniVan, который является "Автомобилем" и является "CloneableType", вы не можете этого сделать:

 // Nope! Multiple inheritance is not possible in C# // for classes. public class MiniVan : Car, CloneableType { } 

Как вы могли догадаться, типы интерфейсов приходят на помощь. После того, как интерфейс определен, он может быть реализованы любым классом или структурой в любой иерархии в любом пространстве имен или любой сборке (написан на любом языке программирования .NET). Как вы можете видеть, интерфейсы очень полиморфны. Рассмотрим стандартный интерфейс .NET с именем ICloneable, определенный в пространстве имен System. Эта интерфейс определяет один метод с именем Clone():

 public interface ICloneable { object Clone(); } 
4
ответ дан Jahan 30 авг. '14 в 2:29 2014-08-30 02:29

Конечно, важно понимать поведение интерфейса и абстрактного класса в ООП (и как их обрабатывают языки), но я думаю, что также важно понять, что именно означает каждый термин. Можете ли вы представить, что команда if не работает точно так же, как смысл этого термина? Кроме того, на самом деле некоторые языки уменьшают, тем более, различия между интерфейсом и абстрактным... если случайно в один прекрасный день два термина работают почти одинаково, по крайней мере, вы можете определить, где (и почему) должен быть какой-либо из них используется для.

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

Интерфейс:

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

Абстрактные:

Что-то, что концентрирует в себе существенные качества чего-либо более обширного или более общего или нескольких вещей; сущность.

Məsələn:

Вы купили автомобиль, и ему нужно топливо.

2019

ответ дан Felypp Oliveira 05 янв. '16 в 7:29 2016-01-05 07:29

Пара других различий:

Абстрактные классы могут иметь статические методы, свойства, поля и т.д., а операторы, интерфейсы не могут. Оператор Cast позволяет выполнять литье в/из абстрактного класса, но не допускает листинг в/из интерфейса.

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

2
ответ дан Orlin Petrov 13 мая '10 в 1:10 2010-05-13 01:10
  • 1
  • 2

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