Vra

Wat maak 'n tipe anders as klas en omgekeerd?

(In die algemene taal-agnostiese sin)

Was dit nuttig?

Oplossing

Die volgende vraag is van GOF boek ( Design Patterns )

  

klas 'n voorwerp se definieer hoe die   voorwerp is geïmplementeer .Die klas   definieer interne staat voorwerp en   die implementering van sy   bedrywighede.

     

In teenstelling, 'n voorwerp se    tipe net verwys na die koppelvlak - 'n   stel van versoeke waaraan dit kan   reageer.

     

'n voorwerp kan baie verskillende tipes het,   en oogmerke van verskillende klasse kan   het dieselfde tipe.

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

max funksie vereis 'n tipe met operasie> met sy eie soort as een van dit koppel enige klas wat die bogenoemde vereiste voldoen kan word om spesifieke maksimum funksie vir daardie klas te genereer.

Ander wenke

Ek dink altyd van 'n "tipe" as 'n oorkoepelende term vir 'klasse' en 'primitiewe'.

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass

geïnspireer deur Wikipedia ...

tipe teorie terme;

  • tipe is 'n abstrakte koppelvlak.
    Tipes algemeen verteenwoordig Woorde, soos 'n persoon, plek of ding, of iets nominalized,

  • klas verteenwoordig 'n implementering van die tipe.
    Dit is 'n konkrete data struktuur en versameling van subroetines

    Verskillende beton klasse kan voorwerpe van dieselfde abstrakte tipe produseer (afhangende van die tipe stelsel).

    Stack (vinnig vir klein stapels, maar skale swak) en SmallStack (skale goed, maar 'n hoë oorhoofse:

    * Byvoorbeeld, kan 'n mens die tipe ScalableStack met twee klasse implementeer vir klein stapels). *

    Net so kan 'n gegewe klas verskillende vervaardigerskampioenskap het .

  

betree beeld beskrywing hier

     

Die piesang voorbeeld.

     
      
  • 'n Banana tipe sal die eienskappe en funksies van piesangs in die algemeen verteenwoordig.

  •   
  • Die ABCBanana en XYZBanana klasse sal maniere van die vervaardiging van piesangs verteenwoordig.
      (Verskillende piesang verskaffers in die werklike lewe, of ander data strukture en funksies te verteenwoordig en piesangs te trek in 'n video game).

         

    Die ABCBanana klas kan dan produseer veral piesangs wat    gevalle van die ABCBanana klas , hulle sou wees voorwerpe van tipe piesang .

  •   

Dit is nie skaars die programmeerder verskaf 'n enkele en enigste implementering vir 'n tipe. In hierdie geval is die klas naam is dikwels identies met die tik naam . Maar daar is nog 'n tipe (wat in 'n koppelvlak kan verkry word indien nodig), en 'n implementering (wat die afsonderlike koppelvlak sal implementeer) watter gevalle (voorwerpe) van die klas bou.

Tik is die oorkoepelende term vir al die beskikbare voorwerp templates of konsepte. 'N Klas is een so 'n voorwerp sjabloon. So is die tipe struktuur, die Integer tipe, die soort Interface ens Dit is alle vorme

As jy wil, kan jy kyk na dit op hierdie manier: 'n tipe is die ouer konsep. Al die ander konsepte: Klas, Interface, struktuur, Integer ens erf hierdie concept.i.e Hulle is tipes

Om dit te illustreer die vinnigste manier:

'n struct is 'n tipe, maar 'n struct is nie 'n klas.

Soos jy kan sien, 'n Tipe is 'n "abstrakte" term vir nie net definisies van klasse, maar ook structs en primitief datatipes soos float, int, Bool.

Tik is konseptueel 'n superstel van klas. In die breër sin, 'n klas is 'n vorm van tipe.

Nou verbonde aan klasse is interfaces, wat kan bee gesien as 'n baie spesiale soort van die klas - 'n suiwer abstrakte een. Hierdie te word tipes.

So "tipe" sluit klasse, interfaces en in die meeste tale primitiewes te. Ook platforms soos die dot-net CLR het struktuur tipes te.

My gedagtes is pretty much in lyn met antwoord aku se.

Ek sien klasse as 'n sjabloon vir die bou van voorwerpe, terwyl tipes is 'n manier om daardie oogmerke te klassifiseer, en voorsien ons met 'n koppelvlak om hulle.

Python voeg ook metaclasses, wat net 'n meganisme om klasse te bou, op dieselfde manier as klasse te bou voorwerpe (en goed, klasse en metaclasses is beide voorwerpe).

Dit reaksie om dieselfde vraag in lamba die uiteindelike lyk my soos 'n perfekte verduideliking.

Geneem uit die GoF-aanhaling van hieronder:

'n voorwerp s'n klas Definieer hoe die voorwerp geïmplementeer word. Die klas definieer die interne toestand van die objek en die implementering van sy bedrywighede.

Daarteenoor is 'n voorwerp s'n tipe verwys slegs na sy koppelvlak -die stel versoeke waarop dit kan reageer.

Ek wil 'n voorbeeld gee wat Java gebruik:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

Albei klasse A en B implementeer die koppelvlak en is dus van die tipe IType.Boonop in Java produseer beide klasse hul eie tipe (onderskeidelik hul klasnaam).Dus die klas A is van tipe A en IType en die klas B is van tipe B en IType bevredigend:

'N Voorwerp kan baie soorte hê, en voorwerpe van verskillende klasse kan dieselfde tipe hê.

Die verskil tussen subtipes en subklas help waarskynlik ook om daardie probleem te verstaan:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

Om nog 'n voorbeeld van onderskeiding te voeg:. In C ++ jy wyser en verwysing tipes wat kan verwys na klasse, maar is nie klasse in en van hulself

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

Let daarop dat slegs een klas betrokke is, maar 'n naby oneindige aantal tipes gebruik kan word. In sommige tale, is funksie beskou as "eerste-klas-voorwerpe" in welke geval, die tipe van 'n funksie is 'n klas. In ander, die tipe van 'n funksie is bloot 'n wyser. Klasse het oor die algemeen die konsepte van in staat is om data, asook bedrywighede hou op daardie data.

Ek dink aan 'n tipe as die stel van dinge wat jy kan doen met 'n bepaalde waarde. Byvoorbeeld, as jy 'n heelgetal waarde, kan jy dit by ander heelgetalle (of voer ander rekenkundige operasies), of slaag dit op funksies wat 'n heelgetal argument aanvaar. As jy 'n voorwerp waarde, kan jy metodes op dit wat gedefinieer word deur sy klas roep.

As gevolg 'n klas definieer wat jy kan doen met voorwerpe van daardie klas, 'n klas definieer 'n tipe. 'N Klas is meer as wat al is, want dit bied ook 'n beskrywing van hoe die metodes geïmplementeer (iets nie te kenne gegee deur die tipe) en hoe die velde van die voorwerp is uitgelê.

Let ook daarop dat 'n voorwerp waarde kan slegs een klas, maar dit kan verskeie tipes het, aangesien elke superklas bied 'n subset van die beskikbare in die klas die voorwerp se funksionaliteit.

Hoewel voorwerpe en tipes is nou verwant, hulle is regtig nie dieselfde ding nie.

Tipe in die algemeen verwys na die klassifikasie van primitiewe waardes -. Heelgetalle, snare, skikkings, boolse, nul, ens Gewoonlik, jy kan nie 'n nuwe tipes te skep

Klas verwys na die naam van stel eienskappe en metodes wat 'n voorwerp is wat verband hou met wanneer dit geskep. Jy kan gewoonlik definieer as baie nuwe klasse as jy wil, hoewel sommige tale jy 'n nuwe voorwerp te skep en dan heg metodes om dit te.

Hierdie definisie is meestal waar, maar sommige tale het probeer om tipes en klasse te kombineer op verskillende maniere, met verskeie voordelige resultate.

Tipes en klasse is verwant, maar nie identies. My neem is dat klasse gebruik word vir implementering erfenis, terwyl tipes word gebruik vir runtime vervanging.

Hier is n skakel verduidelik die vervanging beginsel en waarom subklasse en subtipes is nie altyd dieselfde ding (in Java byvoorbeeld). Die wikipedia bladsy op kovariansie en contravariance het meer inligting oor hierdie onderskeid.

Interessante vraag. Ek dink aku se antwoord is in die kol. Neem die java ArrayList klas as 'n voorbeeld

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

'n geval van die ArrayList klas gesê word van tipe elke superklas dit strek en elke koppelvlak dit implemente te wees. Daarom, 'n geval van die ArrayList klas het 'n tipe ArrayList, RandomAccess, Cloneable, en dies meer. Met ander woorde, waardes (of gevalle) behoort aan een of meer tipes, klasse te definieer wat hierdie tipe is.

Verskillende klasse kan dieselfde tipe beskryf.

Tipe bestaan ​​uit hierdie dele:

  1. Bewerkings = sintaksis
  2. Beskrywing van bewerkings = semantiek

Klas bestaan ​​uit hierdie dele:

  1. Bewerkings = sintaksis
  2. Implementering (= verskeie implementerings beskryf dieselfde semantiek)

Sommige notas:

  • Interface (soos in Java) is nie tipe nie, want dit beskryf nie semantiek nie (beskryf slegs sintaksis)

  • Subklas is nie subtipe nie, want subklas kan semantiek verander wat in superklas gedefinieer is, subtipe kan nie supertipe semantiek verander nie (sien Liskov-vervangingsbeginsel, bv. hierdie LSP voorbeeld).

Dit is duidelik dat, as daar tale met tipe stelsel wat nie OO programmeertale, tipe moet 'n wyer begrip as wees klas

Selfs in tale soos Java, int is 'n (primitief) tipe, maar nie 'n klas.

Daarom: elke klas is 'n tipe, maar nie elke tipe is 'n klas

.

As ons dink aan die vraag in C # konteks, kom ons geloei antwoord.

C # tipe stelsel is verdeel in volgende kategorieë:

Waarde tipes:

  • Eenvoudige tipes: soos int, lang, vlot, ens
  • Enum tipe
  • struct tipes
  • waarvoor geen nul mag tipes

Reference tipes:

  • Klas tipes
  • Interface tipes
  • Array tipes
  • Delegeer tipes

Soos jy kan sien daar is baie verskillende tipes in C # waarin Klas is net een van hulle. Daar is net een belangrike noot: C # se tipe stelsel is so verenig dat 'n waarde van enige tipe as 'n voorwerp kan behandel word. Elke tipe in C # direk of indirek afgelei van die klas voorwerp tipe, en voorwerp is die uiteindelike basis klas van alle soorte. Waardes van verwysing tipes behandel word as voorwerpe net deur die lees van die waardes soos tipe voorwerp. Waardes van tipes waarde word as voorwerpe deur die verrigting van boks en unboxing bedrywighede.

so as ek sien, tik is 'n sambreel oor baie van die items wat die klas is een van hulle.

Referece: CSahrp taal spesifikasie dokument, bladsy 4

In algemene taal-agnostikus sin -. Klas is 'n besef van die Tipe

Dikwels wanneer dit is die net verwesenliking van daardie tipe, jy kan beide terme gebruik om dit te verwys in sommige konteks.

Inteendeel, byvoorbeeld, in C # konteks - Klas is net n van die vele meer implementering van 'n Tik konsep soos primitiewes, structs, wysers, ens.

Dit was 'n goeie vraag vir my, wat my laat dink hard. Ek sou dit waag om te sê dat Klas is 'n compiletime thingy en Tipe is 'n runtime dingetjie. Ek sê dit omdat jy klasse nie tipes skryf. Die samesteller dan skep tipes van klasse, en die tipes runtime gebruik om gevalle van voorwerpe te skep.

Tipes in C, soos Int Float, kar ens definieer data wat gebruik kan word opgetree op met spesifieke metodes wat gebruik kan werk op hulle. Dit is nie meer ingewikkeld as dit. Soos vir int ek kan optel, aftrek vermenigvuldig en miskien verdeel. Dit is my metodes (of operasies) vir int. A Klas is bloot 'n definisie van 'n nuwe tipe. Ek definieer eerste wat die data lyk. Miskien is sy 'n enkele stukkie. Miskien is dit twee woorde soos 'n kompleks met 'n ware en denkbeeldige deel. Of miskien sy hierdie komplekse dingetjie met 309734325 grepe wat die atoom make-up van 'n vreemde deeltjies op Jupiter. I do not care. Net soos 'n heelgetal, kry ek te make-up die bedrywighede wat ek kan doen met hierdie nuwe tipe data. In die geval van die heelgetal het ek optel, aftrek, ens Met hierdie nuwe tipe data wat ek kan definieer watter bedrywighede Ek dink sin maak. Hulle mag wees voeg aftrek ens maar hulle kan ander dinge byvoeg. Dit is alles metodes wat ek besluit om toe te voeg tot my klas.

Die bottom line is dat met 'n soort in C, jy het 'n definisie van wat die data is, dit wil sê, 'n byte, woord, vlot, kar ens Maar enige van hierdie impliseer ook watter bedrywighede wettig en sal betroubare resultate te lewer.

'n klas is nie anders nie, behalwe dit is aan jou om die koppelvlak en aanvaarbare bedrywighede definieer. Die klas definieer hierdie dinge en wanneer jy dit instansieer in 'n Object dit definieer die gedrag van die voorwerp net soos 'n tipe definisie die gedrag van 'n heelgetal definieer wanneer jy werk op dit.

Klasse net gee jy die buigsaamheid om nuwe tipes definieer en alles oor hoe hulle te werk.

Sodra dit gedefinieer, elke keer as ek instansieer 'n voorwerp van die klas "thingy", dit het die datastruktuur Ek gedefinieer en die bedrywighede (metodes) wat ek het gesê jy kan doen met dit. Die klas "thingy" is duidelik niks meer of minder nie as 'n nuwe soort wat C ++ laat my definieer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top