Odpowiedzi:
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.
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
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 .
Przykład banana.
Banana
Typu stanowiłoby właściwości i funkcjonalności bananów w ogóle.
ABCBanana
IXYZBanana
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).
ABCBanana
Klasy może następnie spowodować szczególnych banany, które są instancje tejABCBanana
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.
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
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ź:
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.
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.
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.
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.
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.
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 A
i B
implementują interfejs, a zatem są tego typu IType
. Dodatkowo w Javie obie klasy tworzą własny typ (odpowiednio do nazwy klasy). Zatem klasa A
jest typowa, A
a IType
klasa B
jest 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
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.
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ć.
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.
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.
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
Interesujące pytanie. Myślę, że odpowiedź Aku jest trafna. Weźmy na ArrayList
przykład klasę Java
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
Mówi się, że instancja klasy jest typu każdej nadklasy, którą rozszerza, i każdego interfejsu, który implementuje. Dlatego też wystąpienie ArrayList
klasy jest typu ArrayList
, RandomAccess
, Cloneable
i tak dalej. Innymi słowy, wartości (lub wystąpienia) należą do jednego lub więcej typów, a klasy definiują te typy.
Różne klasy mogą opisywać ten sam typ.
Typ składa się z następujących części:
Zajęcia składają się z następujących części:
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 ).
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:
Typy referencyjne:
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
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.