Jaka jest różnica między typem a klasą?

Odpowiedzi:

121

Następująca odpowiedź pochodzi z książki Gof ( Wzorce projektowe )

Klasa obiektu definiuje sposób implementacji obiektu. Klasa definiuje stan wewnętrzny obiektu oraz implementację jego operacji.

Z kolei typ obiektu odnosi się tylko do jego interfejsu - zestawu żądań, na które może odpowiadać.

Obiekt może mieć wiele typów, a obiekty różnych klas mogą mieć ten sam typ.

//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
}

Funkcja max wymaga typu z operacją> z własnym typem, ponieważ jeden z nich jest interfejsem dowolnej klasy, która spełnia powyższe wymaganie, może zostać użyta do wygenerowania określonej funkcji max dla tej klasy.

yesraaj
źródło
56

Zawsze myślę o „typie” jako o ogólnym pojęciu „klas” i „prymitywów”.

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

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

Eddie Parker
źródło
7
ładne i zwięzłe wyjaśnienie :)
aku
3
Cóż, w .NET powinno być tak samo, nawet prymitywy są klasami (a dokładniej strukturami).
dalle
4
@dalle: zgadzam się, nie ma nieodłącznej różnicy między typem a klasą. Przykład Eddiego jest bardzo zależny od C ++ / Java. To wcale nie jest TA definicja.
Robert Gould
Wyobrażam sobie, że trudno będzie uzyskać „TENĄ” definicję „typu” w porównaniu do klasy. Tak wiele języków ma swój własny system pisania. Słyszałem z definicji .NET, że „typ” obejmuje zarówno typy ref, jak i typy wartości, podczas gdy klasa jest używana tylko do opisywania typów ref.
Eddie Parker
2
Czy nie jest to tylko short-hand dla System.Int32? Innymi słowy: int foo; // Typ to int, klasa to System.Int32?
Svish
51

Zainspirowany Wikipedią ...

W kategoriach teorii typów ;

  • Typ jest abstrakcyjny interfejs.
    Typy zazwyczaj reprezentują rzeczowniki, takie jak osoba, miejsce lub rzecz, lub coś nominowanego,

  • Klasa reprezentuje implementację typu.
    Jest to konkretna struktura danych i zbiór podprogramów

    Różne konkretne klasy mogą tworzyć obiekty tego samego typu abstrakcyjnego (w zależności od systemu typów).

    * Na przykład, można zaimplementować typ Stack z dwiema klasami : SmallStack(szybki dla małych stacków, ale słabo skaluje) i ScalableStack(dobrze skaluje, ale wysoki narzut dla małych stacków). *

    Podobnie, dana klasa może mieć kilka różnych konstruktorów .

wprowadź opis obrazu tutaj

Przykład banana.

  • Banana Typu stanowiłoby właściwości i funkcjonalności bananów w ogóle.

  • ABCBananaI XYZBanana zajęcia stanowiłoby sposoby produkcji bananów.
    (Różni dostawcy bananów w prawdziwym życiu lub różne struktury danych i funkcje do reprezentowania i rysowania bananów w grze wideo).

    ABCBananaKlasy może następnie spowodować szczególnych banany, które są instancje tej ABCBanana klasy , będą przedmioty z typu bananów .

Nierzadko programista zapewnia jedną i jedyną implementację dla typu. W tym przypadku nazwa klasy jest często identyczna z nazwą typu . Ale nadal istnieje typ (który w razie potrzeby można wyodrębnić w interfejsie) i implementację (która implementowałaby oddzielny interfejs), która buduje instancje (obiekty) klasy.

min
źródło
3
Jako ktoś, kto ma trudności z nauką, jeśli nie ma przykładu z prawdziwego świata, naprawdę mi to pomogło. Dzięki.
alexc95
13

Typ to termin ogólny obejmujący wszystkie dostępne szablony obiektów lub koncepcje. Klasa jest jednym z takich szablonów obiektów. Podobnie jest z typem struktury, typem całkowitym, typem interfejsu itd. To są wszystkie typy

Jeśli chcesz, możesz spojrzeć na to w ten sposób: Typ to koncepcja nadrzędna. Wszystkie inne pojęcia: klasa, interfejs, struktura, liczba całkowita itp. Dziedziczą po tym concept.ie Są to typy

Lonzo
źródło
4

Typ zawiera opis danych (tj. Właściwości, operacje itp.),

Klasa to specyficzny typ - to szablon do tworzenia instancji obiektów .

Ściśle mówiąc, klasa jest pojęciem specjalnym, można ją postrzegać jako pakiet zawierający podzbiór metadanych opisujących niektóre aspekty obiektu.

Na przykład w C # można znaleźć interfejsy i klasy. Oba są typami, ale interfejs może definiować tylko niektóre kontrakty i nie może być utworzony w przeciwieństwie do klas.

Mówiąc prościej, klasa to wyspecjalizowany typ używany do hermetyzacji właściwości i zachowania obiektu.

Wikipedia może dać ci pełniejszą odpowiedź:

aku
źródło
4

Aby to zilustrować w najszybszy sposób:

Struktura jest typem, ale struktura nie jest klasą.

Jak widać, Type jest terminem „abstrakcyjnym” nie tylko dla definicji klas, ale także dla struktur i prymitywnych typów danych, takich jak float, int, bool.

icelava
źródło
2
Dobrze byłoby wspomnieć o .net CLR jako przykładzie frameworka, w którym istnieją typy, które nie są klasami (jako inną można wymienić Javę, chociaż .net ma więcej rodzajów typów). Dodatkową małą pomyłką w .net jest jednak to, że Type(pisana wielką literą, jak pokazano) jest krótką nazwą klasy systemowej ( System.Type), która jest używana do przechowywania opisów typów.
supercat
3

Typ jest koncepcyjnie nadzbiorem klas. W szerszym sensie klasa jest jedną z form typu.

Ściśle powiązane z klasami są interfejsy, które można postrzegać jako bardzo szczególny rodzaj klasy - czysto abstrakcyjną. To też są typy.

Tak więc „typ” obejmuje klasy, interfejsy, a także w większości języków prymitywów. Również platformy, takie jak dot-net CLR, mają również typy struktur.

Lawrence Dol
źródło
rajKumar, twoje pytanie jest dość niejednoznaczne. Czy myślisz o „typie” jako o charakterystyce jakiegoś języka, czy też o ogólnej koncepcji?
aku
Jednak nie wszystkie typy zdefiniowane przez użytkownika są klasami, przynajmniej nie we wszystkich językach.
jalf
Jalf, zgadzam się, że to zła charakterystyka. interfejs jest również zdefiniowany przez użytkownika i nie może być żadnych typów zdefiniowanych przez użytkownika. Klasa to wyspecjalizowany typ obsługujący specjalne potrzeby (tworzenie instancji obiektów)
aku
Interfejs to po prostu specjalny typ, czysto abstrakcyjna klasa - wciąż jest typem (w szerszym sensie).
Lawrence Dol
Software Monkey, interfejs nie jest klasą czysto abstrakcyjną - to specjalna koncepcja. „Zdefiniowane przez użytkownika” nie jest definiującą właściwością klas
jang.
3

Aby dodać kolejny przykład rozróżnienia: w C ++ mamy typy wskaźników i referencji, które mogą odwoływać się do klas, ale nie są klasami same w sobie.

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"

Zauważ, że zaangażowana jest tylko jedna klasa, ale można użyć prawie nieskończonej liczby typów. W niektórych językach funkcja jest uważana za „obiekty pierwszej klasy”, w którym to przypadku typem funkcji jest klasa. W innych typ funkcji jest jedynie wskaźnikiem. Klasy generalnie mają koncepcję możliwości przechowywania danych, a także operacji na tych danych.

Zaćmienie
źródło
3

Moje myśli są w dużej mierze zgodne z odpowiedzią Aku.

Postrzegam klasy jako szablon do budowania obiektów, podczas gdy typy są sposobem klasyfikowania tych obiektów i zapewniają nam interfejs do nich.

Python dodaje również metaklasy, które są po prostu mechanizmem do budowania klas, w taki sam sposób, w jaki klasy budują obiekty (a cóż, klasy i metaklasy są obiektami).

Ta odpowiedź na to samo pytanie w lamba the ultimate wydaje mi się doskonałym wyjaśnieniem.

Xose Lluis
źródło
3

Zaczerpnięte z cytatu GoF poniżej:

Klasa obiektów definiuje sposób przedmiot jest realizowany klasa definiuje .Powierzchnia wewnętrzny stan obiektu i realizacji swoich działań.

Natomiast typ obiektu odnosi się tylko do jego interfejsu - zestawu żądań, na które może odpowiadać.

Chcę podać przykład wykorzystujący Javę:

public interface IType {
}

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

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

Obie klasy Ai Bimplementują interfejs, a zatem są tego typu IType. Dodatkowo w Javie obie klasy tworzą własny typ (odpowiednio do nazwy klasy). Zatem klasa Ajest typowa, A a IType klasa Bjest typowa B i IType satysfakcjonująca:

Obiekt może mieć wiele typów, a obiekty różnych klas mogą mieć ten sam typ.

Różnica między podtypami i podklasami prawdopodobnie pomaga również zrozumieć ten problem:

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

SebNag
źródło
2

Myślę o typie jako o zestawie rzeczy, które można zrobić z określoną wartością. Na przykład, jeśli masz wartość całkowitą, możesz dodać ją do innych liczb całkowitych (lub wykonać inne operacje arytmetyczne) lub przekazać ją do funkcji, które akceptują argument będący liczbą całkowitą. Jeśli masz wartość obiektu, możesz wywołać na niej metody zdefiniowane przez jej klasę.

Ponieważ klasa definiuje, co można zrobić z obiektami tej klasy, klasa definiuje typ. Klasa to jednak coś więcej, ponieważ zawiera również opis implementacji metod (coś, co nie jest implikowane przez typ) i jak układane są pola obiektu.

Należy również zauważyć, że wartość obiektu może mieć tylko jedną klasę, ale może mieć wiele typów, ponieważ każda nadklasa zapewnia podzbiór funkcji dostępnych w klasie obiektu.

Więc chociaż obiekty i typy są ze sobą ściśle powiązane, to tak naprawdę nie są tym samym.

Jay Conrod
źródło
2

Typy w C, takie jak Int Float, char itp. Definiują dane, na których można działać za pomocą określonych metod, które mogą na nich działać. To nie jest bardziej skomplikowane. Tak jak dla int mogę dodawać, odejmować, pomnażać i może dzielić. To są moje metody (lub operacje) dla int. Klasa to po prostu definicja nowego typu. Najpierw określam, jak wyglądają dane. Może to trochę. Może to dwa słowa, takie jak kompleks z częścią rzeczywistą i urojoną. A może jest to skomplikowana sprawa z 309734325 bajtami reprezentującymi atomowy skład dziwnej cząstki na Jowiszu. Nie obchodzi mnie to. Podobnie jak w przypadku liczby całkowitej, mogę wymyślić operacje, które mogę wykonać z tym nowym typem danych. W przypadku liczby całkowitej musiałem dodawać, odejmować itp. Dzięki temu nowemu typowi danych mogę zdefiniować wszelkie operacje, które moim zdaniem mają sens. Mogą to być dodawanie odejmowanie itp. ale mogą dodać inne rzeczy. Są to metody, które zdecyduję się dodać do swojej klasy.

Najważniejsze jest to, że w przypadku typu w C masz definicję danych, tj; bajt, słowo, liczba zmiennoprzecinkowa, znak itp. Jednak każda z tych operacji oznacza również, jakie operacje są legalne i dadzą wiarygodne wyniki.

Klasa nie różni się, z wyjątkiem tego, że od Ciebie zależy określenie interfejsu i akceptowalnych operacji. Klasa definiuje te rzeczy, a gdy tworzysz jej instancję w Object, definiuje zachowanie obiektu, tak jak definicja typu definiuje zachowanie liczby całkowitej podczas wykonywania na niej operacji.

Zajęcia dają Ci po prostu elastyczność definiowania nowych typów i wszystkiego, co dotyczy ich działania.

Po zdefiniowaniu tego, za każdym razem, gdy tworzę instancję obiektu klasy „thingy”, ma on zdefiniowaną przeze mnie strukturę danych i operacje (metody), o których powiedziałem, że można z nim wykonać. Klasa „thingy” jest wyraźnie niczym więcej lub mniej niż nowym typem, który C ++ pozwala mi zdefiniować.

Aaron Bauch
źródło
1

Typ ogólnie odnosi się do klasyfikacji wartości pierwotnych - liczb całkowitych, łańcuchów znaków, tablic, wartości logicznych, wartości null itd. Zwykle nie można tworzyć żadnych nowych typów.

Klasa odnosi się do nazwanego zestawu właściwości i metod, z którymi obiekt jest skojarzony podczas tworzenia. Zwykle możesz zdefiniować tyle nowych klas, ile chcesz, chociaż w przypadku niektórych języków musisz utworzyć nowy obiekt, a następnie dołączyć do niego metody.

Ta definicja jest w większości prawdziwa, ale w niektórych językach próbowano łączyć typy i klasy na różne sposoby, z różnymi korzystnymi rezultatami.

za dużo php
źródło
1
Nawet w zubożałym języku C można tworzyć nowe typy, ale nie ma to nic podobnego do tego, co ludzie normalnie uważają za klasy, z wyjątkiem tego, że struktury, rekordy i klasy są do siebie podobne.
James Iry,
1

Typy i klasy są powiązane, ale nie identyczne. Uważam, że klasy są używane do dziedziczenia implementacji, podczas gdy typy są używane do podstawiania w czasie wykonywania.

Oto odsyłacz wyjaśniający zasadę podstawiania i dlaczego podklasy i podtypy nie zawsze są tym samym (na przykład w Javie). Wikipedia stronę na kowariancji i kontrawariancji ma więcej informacji na temat tego rozróżnienia.

Doug Currie
źródło
1

W ogólnym języka-agnostyk sensie - Klasa jest realizacja tego typu .

Często, gdy jest to jedyna realizacja tego typu, możesz użyć obu terminów, aby odnieść się do niej w pewnym kontekście.

Wręcz przeciwnie, na przykład w kontekście C # - Klasa jest po prostu jednym z wielu innych implementacjach o Rodzaj pojęcia jak prymitywy, kodowanym, wskaźniki itp

Siedem
źródło
0

Interesujące pytanie. Myślę, że odpowiedź Aku jest trafna. Weźmy na ArrayListprzykład klasę Java

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

ArrayListMówi się, że instancja klasy jest typu każdej nadklasy, którą rozszerza, i każdego interfejsu, który implementuje. Dlatego też wystąpienie ArrayListklasy jest typu ArrayList, RandomAccess, Cloneablei tak dalej. Innymi słowy, wartości (lub wystąpienia) należą do jednego lub więcej typów, a klasy definiują te typy.

armandino
źródło
0

Różne klasy mogą opisywać ten sam typ.

Typ składa się z następujących części:

  1. Operacje = składnia
  2. Opis operacji = semantyka

Zajęcia składają się z następujących części:

  1. Operacje = składnia
  2. Implementacja (= różne implementacje opisują tę samą semantykę)

Kilka uwag:

  • Interfejs (tak jak w Javie) nie jest typem, ponieważ nie opisuje semantyki (opisuje tylko składnię)

  • Podklasa nie jest podtypem, ponieważ podklasa może zmieniać semantykę zdefiniowaną w nadklasie, podtyp nie może zmieniać semantyki nadtypów (patrz zasada podstawienia Liskova, np. Ten przykład LSP ).

jk_
źródło
0

Oczywiście, ponieważ istnieją języki z systemem typów, które nie są językami programowania obiektowego, typ musi być szerszym pojęciem niż klasa

Nawet w językach takich jak Java intjest (prymitywnym) typem, ale nie klasą.

Stąd: każda klasa jest typem, ale nie każdy typ jest klasą.

Ingo
źródło
0

Jeśli zastanowimy się nad tym pytaniem w kontekście C #, uzyskamy odpowiedź poniżej.

System typu C # jest podzielony na następujące kategorie:

Typy wartości:

  • Proste typy: takie jak int, long, float itp.
  • Typy wyliczeń
  • Typy struktur
  • Typy zerowe

Typy referencyjne:

  • Typy klas
  • Typy interfejsów
  • Typy tablic
  • Typy delegatów

Jak widać, w C # istnieje wiele typów, z których Class jest tylko jednym z nich. Jest tylko jedna ważna uwaga: system typów języka C # jest ujednolicony w taki sposób, że wartość dowolnego typu może być traktowana jako obiekt. Każdy typ w języku C # bezpośrednio lub pośrednio pochodzi od typu klasy obiektu, a obiekt jest ostateczną klasą bazową wszystkich typów. Wartości typów referencyjnych są traktowane jak obiekty, po prostu wyświetlając wartości jako obiekt typu. Wartości typów wartości są traktowane jako obiekty przez wykonywanie operacji pakowania i rozpakowywania.

więc jak widzę, tekst jest parasolem nad wieloma przedmiotami, których klasa jest jedną z nich.

Źródło: specyfikacja języka CSahrp, strona 4

Amirreza
źródło
-1

To było dla mnie dobre pytanie, które dało mi do myślenia. Odważyłbym się powiedzieć, że Class to coś w czasie kompilacji, a Type to gra w środowisku wykonawczym. Mówię to, ponieważ piszesz klasy, a nie typy. Następnie kompilator tworzy typy z klas, a środowisko wykonawcze używa typów do tworzenia wystąpień obiektów.

ThinkAgain
źródło
1
Witamy w SO. Ta odpowiedź jest bardzo podobna do co najmniej jednej innej, a użytkownicy SO wolą bardziej techniczny język niż „coś”!
Nick