Jawaban:
Jawaban berikut dari buku Gof ( Pola Desain )
Obyek class mendefinisikan bagaimana objek diimplementasikan keadaan internal an kelas mendefinisikan objek dan pelaksanaan operasinya.
Sebaliknya, obyek tipe hanya mengacu pada antarmuka - satu set permintaan yang dapat merespon.
Objek dapat memiliki banyak jenis, dan objek dari kelas yang berbeda dapat memiliki tipe yang sama.
//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
}
fungsi max membutuhkan suatu tipe dengan operasi> dengan tipenya sendiri sebagai salah satu dari itu antarmuka setiap kelas yang memenuhi persyaratan di atas dapat digunakan untuk menghasilkan fungsi max spesifik untuk kelas itu.
Saya selalu menganggap 'tipe' sebagai istilah umum untuk 'kelas' dan 'primitif'.
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Terinspirasi oleh Wikipedia ...
Dalam istilah teori jenis ;
Sebuah jenis adalah sebuah antarmuka abstrak.
Jenis umumnya mewakili kata benda, seperti seseorang, tempat atau benda, atau sesuatu yang dinominasikan,
Sebuah kelas merupakan implementasi dari jenis.
Ini adalah struktur data yang konkret dan pengumpulan subrutin
Kelas beton yang berbeda dapat menghasilkan objek dengan tipe abstrak yang sama (tergantung pada jenis sistem).
* Sebagai contoh, seseorang dapat mengimplementasikan tipe tersebut Stack
dengan dua kelas : SmallStack
(cepat untuk tumpukan kecil, tetapi timbangannya buruk) dan ScalableStack
(timbangan dengan baik tetapi overhead tinggi untuk tumpukan kecil). *
Demikian pula, kelas yang diberikan mungkin memiliki beberapa konstruktor yang berbeda .
Contoh pisang.
Suatu
Banana
tipe akan mewakili properti dan fungsi pisang secara umum.The
ABCBanana
danXYZBanana
kelas akan mewakili cara memproduksi pisang.
(Pemasok pisang yang berbeda dalam kehidupan nyata, atau struktur dan fungsi data yang berbeda untuk mewakili dan menggambar pisang dalam permainan video).The
ABCBanana
kelas maka bisa menghasilkan pisang tertentu yang contoh dariABCBanana
kelas , mereka akan benda dari jenis pisang .
Tidak jarang programmer menyediakan implementasi tunggal dan hanya untuk suatu tipe. Dalam hal ini nama kelas sering identik dengan nama tipe . Tetapi masih ada tipe (yang dapat diekstraksi dalam antarmuka jika diperlukan), dan implementasi (yang akan mengimplementasikan antarmuka terpisah) yang membangun instance (objek) kelas.
Ketik adalah istilah payung untuk semua templat atau konsep objek yang tersedia. Kelas adalah salah satu templat objek tersebut. Begitu juga tipe struktur, tipe Integer, tipe Interface dll. Ini semua adalah tipe
Jika Anda mau, Anda bisa melihatnya dengan cara ini: Tipe adalah konsep induk. Semua konsep lain: Kelas, Antarmuka, Struktur, Integer dll mewarisi dari konsep ini. Yaitu jenis
Jenis berisi deskripsi data (yaitu properti, operasi, dll),
Kelas adalah tipe spesifik - ini adalah templat untuk membuat instance objek .
Kelas yang berbicara secara ketat adalah konsep khusus, dapat dilihat sebagai paket yang berisi subset dari metadata yang menggambarkan beberapa aspek dari suatu objek.
Sebagai contoh di C # Anda dapat menemukan antarmuka dan kelas. Keduanya adalah tipe, tetapi antarmuka hanya dapat mendefinisikan beberapa kontrak dan tidak dapat dipakai seperti kelas.
Sederhananya kelas adalah jenis khusus yang digunakan untuk merangkum properti dan perilaku objek.
Wikipedia dapat memberi Anda jawaban yang lebih lengkap:
Untuk menggambarkannya dengan cara tercepat:
Struct adalah suatu Type, tetapi Struct bukanlah suatu Class.
Seperti yang Anda lihat, suatu Type adalah istilah "abstrak" untuk tidak hanya definisi kelas, tetapi juga struct dan tipe data primitif seperti float, int, bool.
Type
(huruf besar seperti yang ditunjukkan) adalah nama pendek dari kelas sistem ( System.Type
) yang digunakan untuk menyimpan deskripsi jenis.
Tipe secara konseptual adalah superset kelas. Dalam arti yang lebih luas, kelas adalah salah satu bentuk tipe.
Yang terkait erat dengan kelas adalah antarmuka, yang dapat dilihat sebagai jenis kelas yang sangat spesial - yang murni abstrak. Ini juga tipe.
Jadi "ketik" meliputi kelas, antarmuka, dan dalam kebanyakan bahasa juga primitif. Platform seperti dot-net CLR juga memiliki tipe struktur.
Untuk menambahkan contoh pembedaan lain: di C ++ Anda memiliki tipe penunjuk dan referensi yang dapat merujuk ke kelas, tetapi bukan kelas dalam dan dari dirinya sendiri.
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"
Perhatikan bahwa hanya satu kelas yang terlibat, tetapi jumlah tipe yang hampir tak terbatas dapat digunakan. Dalam beberapa bahasa, fungsi dianggap "objek kelas satu" dalam hal ini, jenis fungsi adalah kelas. Pada yang lain, tipe fungsi hanyalah sebuah pointer. Kelas umumnya memiliki konsep untuk dapat menyimpan data, serta operasi pada data itu.
Pikiranku cukup sejalan dengan jawaban aku.
Saya melihat kelas sebagai templat untuk membangun objek, sedangkan tipe adalah cara untuk mengklasifikasikan objek-objek itu, dan memberi kami antarmuka untuknya.
Python juga menambahkan metaclasses, yang hanya merupakan mekanisme untuk membangun kelas, dengan cara yang sama seperti kelas membangun objek (dan well, kelas dan metaclasses adalah kedua objek).
Tanggapan terhadap pertanyaan yang sama dalam lamba yang paling utama bagi saya sepertinya penjelasan yang sempurna.
Diambil dari kutipan GoF dari bawah:
Sebuah benda ini kelas mendefinisikan bagaimana objek diimplementasikan mendefinisikan kelas .suatu keadaan internal objek dan pelaksanaan operasinya.
Sebaliknya, sebuah benda ini jenis hanya mengacu pada antarmuka -the set permintaan yang dapat merespon.
Saya ingin memberikan contoh menggunakan Java:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
Kedua kelas A
dan B
mengimplementasikan antarmuka dan dengan demikian adalah tipe IType
. Selain itu di Jawa, kedua kelas menghasilkan tipe mereka sendiri (masing-masing dengan nama kelas mereka). Dengan demikian kelasnya A
berjenis A
dan IType
kelasnya B
berjenis B
dan IType
memuaskan:
Objek dapat memiliki banyak jenis, dan objek dari kelas yang berbeda dapat memiliki tipe yang sama.
Perbedaan antara subtipe dan subkelas mungkin membantu untuk memahami masalah itu juga:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
Saya menganggap jenis sebagai himpunan hal-hal yang dapat Anda lakukan dengan nilai tertentu. Misalnya, jika Anda memiliki nilai integer, Anda bisa menambahkannya ke integer lain (atau melakukan operasi aritmatika lainnya), atau meneruskannya ke fungsi yang menerima argumen integer. Jika Anda memiliki nilai objek, Anda bisa memanggil metode yang ditentukan oleh kelasnya.
Karena kelas mendefinisikan apa yang dapat Anda lakukan dengan objek kelas itu, kelas mendefinisikan suatu tipe. Kelas lebih dari itu, karena juga memberikan deskripsi tentang bagaimana metode diimplementasikan (sesuatu yang tidak tersirat oleh tipe) dan bagaimana bidang objek diletakkan.
Perhatikan juga bahwa nilai objek hanya dapat memiliki satu kelas, tetapi mungkin memiliki beberapa jenis, karena setiap superclass menyediakan subset dari fungsionalitas yang tersedia di kelas objek.
Jadi, meskipun objek dan tipe terkait erat, mereka sebenarnya bukan hal yang sama.
Jenis dalam C, seperti Int Float, char dll mendefinisikan data yang dapat ditindaklanjuti dengan metode khusus yang dapat beroperasi pada mereka. Tidak lebih rumit dari itu. Seperti untuk int saya bisa menambahkan, kurangi gandakan dan mungkin bagi. Itu adalah metode (atau operasi) saya untuk int. Kelas hanyalah definisi dari tipe baru. Saya pertama-tama mendefinisikan seperti apa data itu. Mungkin sedikit. Mungkin itu dua kata seperti kompleks dengan bagian nyata dan imajiner. Atau mungkin benda rumit ini dengan 309734325 byte yang mewakili susunan atom dari partikel aneh di Jupiter. Saya tidak peduli Sama seperti integer, saya bisa melakukan operasi yang bisa saya lakukan dengan tipe data baru ini. Dalam hal bilangan bulat saya telah menambah, mengurangi, dll. Dengan tipe data baru ini saya dapat mendefinisikan operasi apa pun yang menurut saya masuk akal. Mereka mungkin menambahkan kurangi dll tetapi mereka dapat menambahkan hal-hal lain. Ini adalah metode apa pun yang saya putuskan untuk ditambahkan ke kelas saya.
Intinya adalah bahwa dengan tipe dalam C, Anda memiliki definisi tentang apa data itu, yaitu; byte, kata, float, char dll. Tetapi semua ini juga menyiratkan operasi apa yang legal dan akan menghasilkan hasil yang dapat diandalkan.
Kelas tidak berbeda kecuali terserah Anda untuk menentukan antarmuka dan operasi yang dapat diterima. Kelas mendefinisikan hal-hal ini dan ketika Anda instantiate di Obyek itu mendefinisikan perilaku objek seperti definisi tipe mendefinisikan perilaku integer ketika Anda beroperasi di atasnya.
Kelas hanya memberi Anda fleksibilitas untuk mendefinisikan tipe baru dan segala sesuatu tentang bagaimana mereka beroperasi.
Setelah ini didefinisikan, setiap kali saya instantiate objek kelas "thingy", ia memiliki struktur data yang saya definisikan dan operasi (metode) yang saya katakan dapat Anda lakukan dengannya. Kelas "thingy" jelas tidak lebih atau kurang dari tipe baru yang C ++ izinkan saya definisikan.
Jenis umumnya mengacu pada klasifikasi nilai primitif - bilangan bulat, string, array, boolean, null, dll. Biasanya, Anda tidak dapat membuat jenis baru.
Kelas mengacu pada set bernama properti dan metode yang terkait dengan objek ketika dibuat. Anda biasanya dapat mendefinisikan kelas baru sebanyak yang Anda inginkan, meskipun beberapa bahasa Anda harus membuat objek baru dan kemudian melampirkan metode ke sana.
Definisi ini sebagian besar benar, tetapi beberapa bahasa telah berusaha untuk menggabungkan jenis dan kelas dalam berbagai cara, dengan berbagai hasil yang bermanfaat.
Jenis dan kelas terkait tetapi tidak identik. Menurut saya, kelas digunakan untuk warisan implementasi, sedangkan tipe digunakan untuk substitusi runtime.
Berikut ini tautan yang menjelaskan prinsip substitusi dan mengapa subkelas dan subtipe tidak selalu sama (misalnya di Jawa). The wikipedia halaman di kovarians dan contravariance memiliki informasi lebih lanjut tentang perbedaan ini.
Secara umum bahasa-agnostik - Kelas adalah realisasi dari Jenis .
Seringkali ketika ini adalah satu - satunya realisasi dari jenis itu, Anda dapat menggunakan kedua istilah untuk referensi dalam beberapa konteks.
Sebaliknya, misalnya, di C # konteks - Kelas hanyalah salah satu dari banyak implementasi dari Jenis konsep seperti primitif, struct, pointer dll
Pertanyaan menarik. Saya pikir jawaban saya tepat. Ambil ArrayList
kelas java sebagai contoh
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Sebuah instance dari ArrayList
kelas dikatakan tipe dari setiap superclass yang diperluas dan setiap antarmuka yang diimplementasikan. Oleh karena itu, sebuah instance dari ArrayList
kelas memiliki tipe ArrayList
, RandomAccess
, Cloneable
, dan sebagainya. Dengan kata lain, nilai (atau contoh) milik satu atau lebih tipe, kelas mendefinisikan apa tipe ini.
Kelas yang berbeda dapat menggambarkan tipe yang sama.
Jenis terdiri dari bagian-bagian ini:
Kelas terdiri dari bagian-bagian ini:
Beberapa catatan:
Antarmuka (seperti di Jawa) bukan tipe, karena tidak menjelaskan semantik (hanya menjelaskan sintaks)
Subclass bukan subtipe, karena subclass dapat mengubah semantik yang ditentukan dalam superclass, subtipe tidak dapat mengubah semantik supertype (lihat Prinsip Substitusi Liskov, misalnya contoh LSP ini ).
Jelas, karena ada bahasa dengan sistem tipe yang bukan bahasa pemrograman OO, tipe harus konsep yang lebih luas daripada kelas
Bahkan dalam bahasa seperti Java, int
adalah tipe (primitif), tetapi bukan kelas.
Oleh karena itu: setiap kelas adalah tipe, tetapi tidak setiap tipe adalah kelas.
Jika kita memikirkan pertanyaan ini dalam konteks C #, kita mencapai jawaban di bawah.
Sistem tipe C # dibagi menjadi beberapa kategori berikut:
Jenis nilai:
Jenis referensi:
Seperti yang Anda lihat ada banyak jenis di C # yang Kelas hanya salah satunya. Hanya ada satu catatan penting: Sistem tipe C # adalah unified sehingga nilai dari jenis apa pun dapat diperlakukan sebagai objek. Setiap tipe dalam C # secara langsung atau tidak langsung berasal dari tipe kelas objek, dan objek adalah kelas dasar utama dari semua tipe. Nilai tipe referensi diperlakukan sebagai objek hanya dengan melihat nilai sebagai objek tipe. Nilai tipe nilai diperlakukan sebagai objek dengan melakukan operasi tinju dan unboxing.
jadi seperti yang saya lihat, ketik adalah payung atas banyak item yang kelasnya adalah salah satunya.
Referensi: Dokumen Spesifikasi Bahasa CSahrp, halaman 4
Ini adalah pertanyaan yang bagus untuk saya, yang membuat saya berpikir keras. Saya berani mengatakan bahwa Class adalah thingy compiletime dan Type adalah thingy runtime. Saya mengatakan ini karena Anda menulis kelas bukan tipe. Kompiler kemudian membuat tipe dari kelas, dan runtime menggunakan tipe untuk membuat instance objek.