Is de programmeertaal C objectgeoriënteerd?

Ik sprak met een collega over C en C++ en hij beweerde dat C objectgeoriënteerd is, maar ik beweerde dat dat niet zo was. Ik weet dat je objectgeoriënteerde dingen kunt doen in C, maar C++ is een echte objectgeoriënteerde taal.

Wat vind je ervan?

Het leidde ook tot discussie over wie beslist wat het betekent om objectgericht te zijn en dat het moeilijk is om te zeggen wat objectgericht werkelijk officieel betekent. Wat vind je hiervan?


Antwoord 1, autoriteit 100%

Indien door “is C object georiënteerd?” je bedoelt “is C ontworpen met faciliteiten die specifiek objectgeoriënteerd programmeren ondersteunen?” dan, nee, C is duidelijk niet objectgeoriënteerd.


Antwoord 2, autoriteit 29%

Je kunt in een objectgeoriënteerde stijl in min of meer elke taal programmeren. (Ik denk dat runtime-polymorfisme — d.w.z. virtuele methoden — een taal vereist die functieaanwijzers ondersteunt.)

Hier zijn een paar voorbeelden:


Antwoord 3, autoriteit 14%

C is niet objectgeoriënteerd. Dat was het hele doel achter de ++

Voor wat betreft een definitie van wat er nodig is om objectgeoriënteerd te zijn: kijk op wikipedia.

Persoonlijk, als het erfenis, inkapseling en polymorfisme ondersteunt, dan is u goed om te gaan. Een andere sleutel hier is het hebben van leuke zoekwoorden zoals klasse en object hebben de neiging om te helpen …

Voorbeelden van echte objectgeoriënteerde talen (niet overtuigend) zijn: Smalltalk, Java, C #, Python, Ruby, C++ ..

Het is ook mogelijk om extensies te hebben om OO-functies te bieden zoals PHP, PERL, VB (niet .NET), …


4, Autoriteit 13%

Echte programmeurs kunnen in elke taal objectgeoriënteerde code schrijven.

Maar nee, c is geen ‘objectgeoriënteerde’ taal. Het heeft geen concept van klassen, objecten, polymorfisme, erfenis.


5, Autoriteit 6%

C is geen O-O-taal onder elke definitie van “O-O” en “Taal”.

Het is vrij eenvoudig te gebruiken C als de implementatietaal voor een component die een O-O API aan zijn klanten geeft. Het X Windows-systeem is in wezen een O-O-systeem met één overerving van zijn API, maar een hele puinhoop van C bij het bekijken van de implementatie ervan.


6, Autoriteit 4%

De verwarring kan zijn dat C kan worden gebruikt om objectgeoriënteerde concepten zoals polymorfisme, inkapseling, enz. te implementeren, wat ertoe kan leiden dat uw vriend denkt dat C objectgeoriënteerd is. Het probleem is dat om als een objectgeoriënteerde programmeertaal te worden beschouwd, deze functies in de taal moeten worden ingebouwd. Wat ze niet zijn.


Antwoord 7, autoriteit 4%

  1. C is niet objectgeoriënteerd in strikte zin, aangezien het geen ingebouwde, door syntaxis ondersteunde objectgeoriënteerde mogelijkheid heeft, zoals klasse, overerving enzovoort.

Maar als je de truc kent, kun je er eenvoudig objectgeoriënteerde mogelijkheden aan toevoegen door simpelweg struct, function pointer, & zelf-wijzer. DirectFB is zo’n C-bibliotheek die op een objectgeoriënteerde manier is geschreven. Het slechte ding is dat het meer foutgevoelig is, omdat het niet wordt beheerst door syntaxis en controle van het compileertype. Het is in plaats daarvan gebaseerd op codeerconventies.

bijv.

 IDirectFB/*a typedef of a struct*/ *dfb = NULL;
  IDirectFBSurface/*another typedef of a struct*/ *primary = NULL;
  DirectFBCreate (&dfb); /*factory method to create a struct (e.g. dfb) with 
                         pointers to function and data. This struct is 
                         like an object/instance of a class in a language with build-in 
                         syntax support for object oriented capability  */
  dfb->SetCooperativeLevel/*function pointer*/ 
          (dfb/*self pointer to the object dfb*/, 
           DFSCL_FULLSCREEN);
  dsc.flags = DSDESC_CAPS;
  dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
  dfb->CreateSurface/*function pointer, also a factory method 
                       to create another object/instance */
          ( dfb/*self pointer to the object dfb*/, 
            &dsc, 
            &primary/*another struct work as object of another class created*/ );
  primary->GetSize/*function pointer*/ 
              (primary/*self pointer to the object primary*/, 
               &screen_width, 
               &screen_height);

2 . C++ is objectgeoriënteerd omdat het ingebouwde ondersteuning heeft voor objectgeoriënteerde mogelijkheden zoals klasse en overerving. Maar er is een argument dat het geen volledige of pure objectgeoriënteerde taal is, omdat het de C-syntaxis (structurele programmeersyntaxis) erin toestaat. Ik herinner me ook dat C++ een paar objectgeoriënteerde mogelijkheden mist, maar ik herinner me ze niet allemaal precies.


Antwoord 8, autoriteit 3%

Tenzij je vriend het had over Objective C (een OO-superset van C), nee, C is geen OO-taal. Je kunt OO-concepten implementeren met C (dat is wat de oude cfront C++-compiler deed, het vertaalde C++ naar C) maar dat maakt C nog geen OO-taal omdat het niet specifiek ondersteuning biedt voor standaard OO-technieken zoals polymorfisme of inkapseling.

Ja, je kunt software in OO-stijl in C schrijven, vooral met liberaal (ab-)gebruik van macro’s, maar als iemand die de resultaten van sommige van die pogingen heeft gezien, raad ik je ten zeerste aan om een beter passende taal te gebruiken.


Antwoord 9

Echte programmeurs kunnen objectgeoriënteerde code schrijven in ELKE taal.

Ik hebObject Oriented Cobol gezien. Cobol die Cobol noemt. Wil je deze programmeurs “echt” noemen?


Antwoord 10

C is geen objectgeoriënteerde taal.
C is een algemene, imperatieve taal die gestructureerd programmeren ondersteunt.
Omdat C niet objectgeoriënteerd is, is C++ ontstaan om OOP’s te hebben en OOP is een programmeertaalmodel dat is georganiseerd rond objecten.
Een taal om OOP’s-functie te hebben, moet bepaalde principes van OOP’s implementeren. Enkele daarvan zijn overerving, polymorfisme, abstractie en inkapseling.


Antwoord 11

C is niet Objectgericht.

C oriënteert zich nietop objecten.

C++ doet.


Antwoord 12

Hoewel C zelf gebouwd was als proceduretaal (het “denkt” in termen van procedure: je voert eerst functie A uit, dan geef je de uitvoer door aan functie B enz. het ondersteunt “out of the box” alleen functionele programmastroom),
Het is mogelijk om OOP over C te implementeren (in OOP wordt het verhaal aangedreven door objecten en hun verantwoordelijkheden in plaats van functies en hun oproepvolgorde).
Sommige vroege C++-implementaties waren zelfs bezig met het vertalen van de code naar een C-code en deze vervolgens te bouwen.
Soms moet u echter C gebruiken (voor Embedded-apparaten / GPU-talen die geen C++ ondersteunen, enz.). En je wilt OOP. Ik raad je aan om COOPte bekijken – mijn C OOP lichtgewicht maar krachtig framework voor C object-georiënteerd programmeren.


Antwoord 13

C is een objectgebaseerde taal, het ondersteunt niet veel functies van objectgeoriënteerde talen zoals overerving, polymorfisme enz.


Antwoord 14

C is niet objectgeoriënteerd. C++ is niet objectgeoriënteerd. Laat het me uitleggen:
Object Oriented is een uitbreiding op Simula’s ouderwetse evenementgestuurde subset. Real Object Oriented is functioneel en reflectief omdat Object Oriented echt een groep paradigma’s is (gebeurtenisgestuurd, functioneel, reflectief). Slechts vier talen zijn echt objectgeoriënteerd en dit zijn Lisp, Smalltalk, Ruby en Ocaml. Perl blijft tussen omdat het niet functioneel is. Scala is niet reflecterend dus blijft ook achter. C++ is alleen gebeurtenisgestuurd met een aantal Simula-achtige faciliteiten, maar de volledig gestructureerde programmeertaal is niet declaratief of komt zelfs niet overeen met de echte wereld. Object Oriented komt overeen met de echte wereld met Functional (Maths), Event Driven (Conversations) en Reflectiveness (Evolution). C++ heeft alleen conversaties. C++ is niet declaratief zoals wiskunde of evolueert niet zoals het leven. C++ praat alleen als mensen. C++ is als een idioot die niet weet hoe wiskunde werkt of hoe het leven evolueert.


Antwoord 15

Nee, dat is het niet, je vriend heeft het mis.

Other episodes