Apa perbedaan antara Tipe dan Kelas?

Jawaban:

121

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.

yesraaj
sumber
56

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

Eddie Parker
sumber
7
penjelasan yang bagus dan ringkas :)
aku
3
Nah, dalam. NET harus sama, bahkan primitif adalah kelas (atau lebih tepatnya struct).
dalle
4
@dalle: setuju, tidak ada perbedaan inheren antara tipe dan kelas. Contoh Eddie sangat bergantung pada C ++ / Java. Sama sekali bukan definisi.
Robert Gould
Saya membayangkan akan sulit untuk mendapatkan definisi "tipe" dari 'tipe' versus kelas. Begitu banyak bahasa memiliki sistem pengetikan mereka sendiri. Satu definisi yang saya dengar untuk .NET adalah bahwa 'tipe' termasuk tipe ref dan nilai, sedangkan kelas hanya digunakan untuk menggambarkan tipe ref.
Eddie Parker
2
Bukankah int hanya kependekan dari System.Int32? Dengan kata lain: int foo; // Ketik adalah int, kelasnya adalah System.Int32?
Svish
51

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 .

masukkan deskripsi gambar di sini

Contoh pisang.

  • Suatu Banana tipe akan mewakili properti dan fungsi pisang secara umum.

  • The ABCBananadan XYZBanana 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 ABCBananakelas maka bisa menghasilkan pisang tertentu yang contoh dari ABCBanana 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.

mnt
sumber
3
Sebagai seseorang yang berjuang untuk belajar kecuali diberikan contoh dunia nyata, ini benar-benar sangat membantu saya. Terima kasih.
alexc95
13

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

Lonzo
sumber
4

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:

aku
sumber
4

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.

icelava
sumber
2
Akan lebih baik untuk menyebutkan. Net CLR sebagai contoh kerangka kerja di mana ada jenis yang bukan kelas (Java dapat dikutip sebagai yang lain, meskipun. Net memiliki lebih banyak jenis jenis). Kerut kecil tambahan di .net, adalah bahwa Type(huruf besar seperti yang ditunjukkan) adalah nama pendek dari kelas sistem ( System.Type) yang digunakan untuk menyimpan deskripsi jenis.
supercat
3

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.

Lawrence Dol
sumber
rajKumar, pertanyaan Anda cukup ambigu. apakah Anda sebagai "mengetik" sebagai fitur dari beberapa bahasa, atau sebagai konsep umum?
aku
Tidak semua tipe yang ditentukan pengguna adalah kelas, setidaknya tidak dalam semua bahasa.
jalf
jalf, setuju itu adalah karakteristik yang salah. antarmuka juga ditentukan pengguna, dan tidak ada tipe yang ditentukan pengguna. Kelas adalah jenis khusus yang melayani kebutuhan khusus (membuat instance objek)
aku
Antarmuka hanyalah tipe khusus, kelas yang murni abstrak - itu masih tipe (dalam arti yang lebih besar).
Lawrence Dol
Software Monkey, antarmuka bukan kelas yang murni abstrak - itu adalah konsep khusus. "user-defined" bukan properti mendefinisikan kelas
aku
3

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.

Gerhana
sumber
3

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.

Xose Lluis
sumber
3

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 Adan Bmengimplementasikan 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 Aberjenis A dan IType kelasnya Bberjenis 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

SebNag
sumber
2

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.

Jay Conrod
sumber
2

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.

Aaron Bauch
sumber
1

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.

terlalu banyak php
sumber
1
Bahkan dalam tipe bahasa miskin C Anda dapat membuat tipe baru, tetapi tidak ada yang seperti apa yang orang pikirkan sebagai kelas kecuali dalam banyak hal seperti struct, catatan, dan kelas semua jenis mirip satu sama lain.
James Iry
1

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.

Doug Currie
sumber
1

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

Sevenate
sumber
0

Pertanyaan menarik. Saya pikir jawaban saya tepat. Ambil ArrayListkelas java sebagai contoh

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

Sebuah instance dari ArrayListkelas dikatakan tipe dari setiap superclass yang diperluas dan setiap antarmuka yang diimplementasikan. Oleh karena itu, sebuah instance dari ArrayListkelas memiliki tipe ArrayList, RandomAccess, Cloneable, dan sebagainya. Dengan kata lain, nilai (atau contoh) milik satu atau lebih tipe, kelas mendefinisikan apa tipe ini.

armandino
sumber
0

Kelas yang berbeda dapat menggambarkan tipe yang sama.

Jenis terdiri dari bagian-bagian ini:

  1. Operasi = sintaksis
  2. Deskripsi operasi = semantik

Kelas terdiri dari bagian-bagian ini:

  1. Operasi = sintaksis
  2. Implementasi (= berbagai implementasi menggambarkan semantik yang sama)

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 ).

jk_
sumber
0

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, intadalah tipe (primitif), tetapi bukan kelas.

Oleh karena itu: setiap kelas adalah tipe, tetapi tidak setiap tipe adalah kelas.

Ingo
sumber
0

Jika kita memikirkan pertanyaan ini dalam konteks C #, kita mencapai jawaban di bawah.

Sistem tipe C # dibagi menjadi beberapa kategori berikut:

Jenis nilai:

  • Tipe sederhana: seperti int, long, float, dll.
  • Jenis Enum
  • Jenis struktur
  • Jenis tidak dapat dibatalkan

Jenis referensi:

  • Jenis kelas
  • Jenis antarmuka
  • Jenis array
  • Mendelegasikan tipe

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

Amirreza
sumber
-1

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.

Pikirkan lagi
sumber
1
Selamat datang di SO. Jawaban ini sangat mirip dengan setidaknya satu lainnya dan pengguna SO lebih suka bahasa teknis daripada 'thingy'!
Nick