Vraag Interfacecontract, Klasseobject?


Is het contract om te interfacen als object naar de klas?

Wat is de noodzaak om identieke zaken als deze te onderscheiden, van de code tot de uitvoeringscode? Ik krijg het idee achter het benoemen van een klasse een klasse en de geïnstantieerde uitvoerende klasse een object, maar over het algemeen is dat de enige reden voor deze semi-overtollige termen?


16
2017-10-20 18:39


oorsprong


antwoorden:


Niet echt. Er zijn hier vier termen, dus ik zal ze elk een keer behandelen:

Interface

Een interface is een abstracte klasse (in talen zoals Java waar er geen meerdere overerving is, soms zijn er andere beperkingen, zoals een afzonderlijk gegevenstype) die bedoeld is om te worden gebruikt als een gemeenschappelijke basis voor toegang tot een aantal gelijkgestemde objecten . Conceptueel is er geen vereiste voor abstractheid, maar meestal heeft een interface ten minste één abstracte methode. Een interface is een methode waarmee uw programma kan communiceren met een aantal vergelijkbare klassen, elk met verschillende semantiek maar met hetzelfde algemene doel.

Contract

Een contract is de impliciete overeenkomst die u tussen gebruikers en implementeerders van een klasse of interface maakt. Bijvoorbeeld, randvoorwaarden en postcondities (invarianten zijn meestal een contract binnen de implementatie van de klas - in het algemeen hoeven dingen als de relatie tussen interne leden niet te worden blootgesteld). De specificatie voor een retourwaarde of een argument kan ook deel uitmaken van het contract. Het geeft in feite weer hoe de functie / klasse / interface gebruikt moet worden, en is over het algemeen niet volledig representeerbaar in welke taal dan ook (sommige talen, zoals Eiffel, staan ​​u toe om expliciete contracten in te voeren, maar zelfs deze kunnen niet altijd volledig de vereisten uitwerken ). Wanneer u een interface implementeert of uit een klasse haalt, moet u altijd aan de interfacevereisten voldoen, of, wanneer u een niet-abstracte klasse overschrijft, zich zodanig gedragen dat een externe kijker het verschil niet opmerkt (dit is de Liskov Vervangingsprincipe: een afgeleid object moet in staat zijn om de basis te vervangen zonder enig verschil in gedrag van buitenaf).

Klasse

Een klas hoeft niet veel te doen, omdat je ze duidelijk eerder hebt gebruikt. Een klasse is het gegevenstype en is in sommige talen een superset van interfaces (die geen formele definitie hebben, zoals in C ++), en in andere is deze onafhankelijk (zoals in Java).

Voorwerp

Een object is een instantie van een klassetype (meestal van een niet-klassetype). De exacte definitie van een object is heel specifiek voor een taal, maar de algemene definitie is het feitelijke waarnaar wordt verwezen door meerdere verwijzingen / verwijzingen naar hetzelfde - in sommige talen zoals Java bijvoorbeeld, == vergelijkt of twee variabelen de hetzelfde object, niet per se of ze semantisch hetzelfde zijn. Objecten zijn onafhankelijk van klassen of interfaces - ze vertegenwoordigen een enkele instantie. Een andere manier om erover na te denken is dat klasse of interface de vorm is en dat het object het fysieke object is dat uit de mal komt (een nogal slechte analogie, maar het is het beste dat ik nu kan verzinnen).


30
2017-10-20 19:08



Nee niet echt. Een klasse is een sjabloon die u definieert. Elk object dat die klasse instantieert, volgt de sjabloon. Het zijn niet echt overtollige termen, omdat de twee dingen niet identiek zijn. U kunt een klasse zien als een door de gebruiker gedefinieerd gegevenstype. Klassen en objecten zijn verschillend van elkaar op exact dezelfde manier als het primitieve gegevenstype int is anders dan de letterlijke waarde 3.

Een interface definieert een set methoden die alle implementatieklassen moeten ondersteunen. De interface zelf is het contract dat u definieert voor de implementatieklassen. Het zegt alleen dat elke klasse die de interface implementeert, de reeks openbare methoden van die interface moet hebben.


6
2017-10-20 18:58



Nou, ik denk ... als een interface een contract specificeert dan een klasse specificeert een (of meerdere) instantie (s) van een bepaald object.

Terminologie is echter minder belangrijk dan toepassing.


1
2017-10-20 18:57



Eigenlijk is een interface een contract, wanneer een object een instantie van een klasse is - het zijn verschillende dingen die niet veel gemeen hebben.

De interface biedt alleen maar een gevel voor objecten of een garantie voor de beller dat het object een bepaalde bewerking kan uitvoeren, zelfs zonder de implementatie ervan te kennen.

U kunt bijvoorbeeld twee klassen hebben die dezelfde interface / overeenkomst implementeren, maar totaal verschillende dingen doen (hoewel de betekenis om ze te doen hetzelfde kan zijn).

Neem bijvoorbeeld de IDisposable-interface: elk object kan de bronnen vrijmaken die het gebruikt, maar het kan het op veel verschillende manieren doen, het kan ervoor kiezen om niets vrij te geven. Het is de keuze van het object.

Dit zou in elk geval de POV in .NET zijn


1
2017-10-20 18:57



Om de vorige antwoorden te voltooien, een woord over interfaces:

Als de klasse meer is dan een sjabloon voor een object (vanwege de algemene kenmerken ervan onafhankelijk van eventuele instanties), kan de interface ook worden beschreven als een standpunt

Een klasse die verschillende interfaces implementeert:

  • het contract voltooien dat het moet respecteren
  • staat de gebruiker toe om instanties van die klasse te zien vanuit de standpunt van degene die wordt vertegenwoordigd door de geïmplementeerde interface.

"Oogpunt" betekent dat u een object kunt gebruiken door u uitsluitend te richten op het contract dat door die interface wordt gedefinieerd.

Het is in dat opzicht dat een interface een "abstracte klasse" is, zoals in een "abstractie" (iets dat sommige eigenschappen van een klasse nastreeft, maar een aantal anderen buiten beschouwing laat). In de wereld van Java laat een interface eigenlijk veel te wensen over, omdat deze alleen kan worden toegepast om bijvoorbeeld een contract te definiëren, niet voor statische methoden of functies.


1
2017-10-20 19:29



"Klasse" en "Object" vertegenwoordigen twee verschillende dingen; ze zijn verwant, maar wat ze vertegenwoordigen IS anders, tamelijk sterk.

De beste manier om dit te beschrijven, is door naar Static te kijken. Een klasse kan statische leden hebben, die volledig gescheiden zijn van elke INSTANTIE van die klasse. Objecten van die klasse kunnen al dan niet deze statische leden gebruiken; maar het exemplaar van het object van die klasse staat volledig los van statische gebruiken van die klasse (of zou op zijn minst moeten zijn).

Of denk aan het singleton-patroon. Het opslaan van een instantie van het klasse-object in een statische klassen-accessor is een gangbare praktijk en toont het verschil. U verwijst naar de klasse statische accessor om de object instantie van een singleton-klas; als het klasse statisch lid heeft geen object instantie om te verwijzen naar, de klasse maakt de aanleg van de voorwerp.

In andere woorden; een voorwerp is een instantie van een klasse; maar een klasse kan zijn meer dan alleen een sjabloon van waaruit objecten worden geïnstantieerd. Statische leden van klassen hebben een representatie in het geheugen die volledig onafhankelijk is van objectinstanties van die klassen.


0
2017-10-20 18:57