Type ve Class arasındaki fark nedir?


Yanıtlar:


121

Aşağıdaki cevap Gof kitabından ( Tasarım Desenleri )

Bir nesnenin sınıfı , nesnenin nasıl uygulandığını tanımlar.Sınıf, nesnenin dahili durumunu ve işlemlerinin uygulanmasını tanımlar.

Buna karşılık, bir nesnenin türü yalnızca arabirimine işaret eder - yanıt verebileceği bir dizi istek.

Bir nesnenin birçok türü olabilir ve farklı sınıflardaki nesneler aynı türde olabilir.

//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 işlevi, > sınıf gereksinimini karşılayan herhangi bir sınıf, o sınıf için belirli bir max işlevi oluşturmak için kullanılabilen herhangi bir sınıf olarak kendi türüne sahip bir işlem gerektirir .


56

Ben her zaman 'tip' kelimesini 'sınıflar' ve 'ilkeller' için bir şemsiye terim olarak görüyorum.

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

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


7
güzel ve özlü açıklama :)
aku

3
.NET'te aynı olmalı, ilkel sınıflar bile sınıflardır (veya daha doğrusu yapılar).
dalle

4
@dalle: kabul edildi, tip ve sınıf arasında doğal bir fark yok. Eddie'nin örneği çok C ++ / Java'ya bağımlı. Hiç bir tanım değil.
Robert Gould

Bir sınıfa karşı 'tip'in tanımını elde etmenin zor olacağını düşünüyorum. Pek çok dilin kendi yazım sistemi vardır. .NET için duyduğum bir tanım, bir 'tür'ün hem ref hem de değer türlerini içermesi, bir sınıfın ise yalnızca ref türlerini tanımlamak için kullanılmasıydı.
Eddie Parker

2
İnt sadece System.Int32 için bir kısa el değil mi? Başka bir deyişle: int foo; // Tür int, sınıf System.Int32?
Svish

51

Wikipedia'dan ilham aldı ...

Gelen tipi teorisi açısından;

  • Bir tip soyut bir arabirimdir.
    Türler genellikle kişi, yer ya da şey veya isimlendirilmiş bir şey gibi isimleri temsil eder,

  • Bir sınıf türünde bir uygulama temsil eder.
    Somut bir veri yapısı ve altyordamların toplanmasıdır

    Farklı beton sınıfları aynı soyut tipte nesneler üretebilir (tip sistemine bağlı olarak).

    * Örneğin, türü Stack iki sınıfla uygulayabilirsiniz : SmallStack(küçük yığınlar için hızlı, ancak zayıf ölçekler) veScalableStack (iyi ölçekler ancak küçük yığınlar için yüksek ek yük). *

    Benzer şekilde, belirli bir sınıf birkaç farklı kurucuya sahip olabilir .

resim açıklamasını buraya girin

Muz örneği.

  • Bir Banana tür genel olarak muzların özelliklerini ve işlevselliğini temsil eder.

  • ABCBananaVe XYZBanana sınıflar üreten muz yollarını temsil eder.
    (Gerçek hayatta farklı muz tedarikçileri veya bir video oyununda muzları temsil etmek ve çekmek için farklı veri yapıları ve işlevleri).

    ABCBananaSınıf daha sonra belirli bir muz üretmek olabilir örnekleri arasında ABCBanana sınıfı , bunlar olacaktır nesneler arasında tip Muz .

Programcı bir tür için tek ve tek bir uygulama sağlamak nadir değildir. Bu durumda, sınıf adı genellikle tür adıyla aynıdır . Ancak hala bir tür (gerekirse bir arabirimde çıkarılabilir) ve sınıfın örneklerini (nesnelerini) oluşturan bir uygulama (ayrı arabirimi uygulayacak) vardır.


3
Gerçek dünyaya örnek olmadıkça öğrenmek için mücadele eden biri olarak, bu gerçekten bana gerçekten yardımcı oldu. Teşekkürler.
alexc95

13

Tür, kullanılabilir tüm nesne şablonları veya kavramları için şemsiye terimdir. Sınıf, bu tür bir nesne şablonudur. Yapı tipi, Tamsayı tipi, Arayüz tipi vb.

İsterseniz buna şu şekilde bakabilirsiniz: Bir tür ana kavramdır. Diğer tüm kavramlar: Sınıf, Arayüz, Yapı, Tamsayı vb. Bu kavramdan miras alınır. Onlar Türler


4

Tür, verilerin açıklamasını içerir (yani özellikler, işlemler, vb.),

Sınıf belirli bir türdür - nesnelerin örneklerini oluşturmak için kullanılan bir şablondur .

Kesin olarak konuşan sınıf özel bir kavramdır, bir nesnenin bazı yönlerini tanımlayan meta verilerin alt kümesini içeren bir paket olarak görülebilir .

Örneğin C # 'da arayüzler ve sınıflar bulabilirsiniz. Her ikisi de türdür, ancak arabirim yalnızca bazı sözleşmeleri tanımlayabilir ve sınıfların aksine somutlaştırılamaz.

Basitçe söylemek gerekirse sınıf , bir nesnenin özelliklerini ve davranışını kapsüllemek için kullanılan özel bir türdür .

Wikipedia size daha eksiksiz bir cevap verebilir:


4

En hızlı şekilde göstermek için:

Bir Yapı Tiptir, ancak Yapı Sınıf değildir.

Gördüğünüz gibi, bir Tür yalnızca sınıfların tanımları için değil, aynı zamanda float, int, bool gibi yapılar ve ilkel veri türleri için "soyut" bir terimdir.


2
Sınıflar olmayan türlerin bulunduğu bir çerçeveye örnek olarak .net CLR'den bahsetmek iyi olur (Java, başka tür olarak gösterilebilir, ancak .net'in daha fazla türü vardır). Bununla birlikte, .net'te fazladan küçük bir kırışıklık Type(gösterildiği gibi büyük harfle yazılır), System.Typetürlerin açıklamalarını tutmak için kullanılan bir sistem sınıfının ( ) kısa adıdır .
supercat

3

Tür, kavramsal olarak bir sınıfın üst kümesidir. Daha geniş anlamda, sınıf bir tür biçimidir.

Sınıflarla yakından ilgili, arının çok özel bir sınıf türü olarak görülebilen arayüzler - tamamen soyut bir arayüz. Bunlar da tiplerdir.

Yani "tip" sınıfları, arayüzleri ve çoğu dilde temel ilkeleri kapsar. Ayrıca dot-net CLR gibi platformlar da yapı türlerine sahiptir.


rajKumar, sorunuz oldukça belirsiz. bir dilin bir özelliği olarak ya da genel bir kavram olarak "yaz" hakkında mısınız?
aku

Kullanıcı tanımlı türlerin tümü sınıf değildir, en azından tüm dillerde değildir.
jalf

jalf, bunun yanlış bir özellik olduğunu kabul edin. arabirimi de kullanıcı tanımlıdır ve kullanıcı tanımlı tür olamaz. Sınıf özel ihtiyaçlara hizmet eden özel bir tiptir (nesnelerin örneklerini yaratır)
aku

Bir arayüz sadece özel bir tür, tamamen soyut bir sınıftır - hala bir türdür (daha büyük anlamda).
Lawrence Dol

Yazılım Maymun, arayüz tamamen soyut bir sınıf değildir - özel bir kavramdır. "kullanıcı tanımlı" sınıfların tanımlayıcı bir özelliği değildir
aku

3

Başka bir ayrım örneği eklemek için: C ++ 'da, sınıflara başvurabilen, ancak kendi içinde sınıf olmayan işaretçi ve başvuru türleriniz vardır.

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"

Yalnızca bir sınıfın dahil olduğunu, ancak neredeyse sonsuz sayıda türün kullanılabileceğini unutmayın. Bazı dillerde, işlev "birinci sınıf nesneler" olarak kabul edilir, bu durumda bir işlevin türü bir sınıftır. Diğerlerinde, bir işlevin türü yalnızca bir işaretçidir. Sınıflar genellikle verileri tutabilme kavramlarına ve bu veriler üzerinde işlemlere sahiptir.


3

Düşüncelerim aku'nun cevabı ile hemen hemen aynı.

Sınıfları nesneleri oluşturmak için bir şablon olarak görüyorum, tipler bu nesneleri sınıflandırmanın bir yolu ve bize onlara bir arayüz sağlıyor.

Python, sınıfları nesne oluştururken olduğu gibi, sınıfları oluşturmak için bir mekanizma olan metasınıfları da ekler (ve sınıflar ve metasınıfların ikisi de nesnedir).

Lambada aynı soruya verilen bu nihai cevap bana mükemmel bir açıklama gibi geliyor.


3

Aşağıdan GoF alıntısından alınmıştır:

Nesnelerin sınıfı , nesnenin nasıl uygulandığını tanımlar.Sınıf, nesnenin dahili durumunu ve işlemlerinin uygulanmasını tanımlar.

Buna karşılık, bir nesnenin türü yalnızca arabirimine karşılık gelir - yanıt verebileceği istek kümesi.

Java kullanarak bir örnek vermek istiyorum:

public interface IType {
}

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

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

Her iki sınıf Ave Barabirimi uygular ve böylece türdür IType. Ayrıca Java'da her iki sınıf da kendi türlerini üretir (sırasıyla sınıf adlarına göre). Bu yüzden sınıf Atürdür A ve IType sınıf Btür B ve IType tatmin edicidir:

Bir nesnenin birçok türü olabilir ve farklı sınıflardaki nesneler aynı türde olabilir.

Alt türler ve alt sınıf arasındaki fark muhtemelen bu sorunun anlaşılmasına yardımcı olur:

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


2

Bir türü belirli bir değerle yapabileceğiniz şeyler kümesi olarak düşünüyorum. Örneğin, bir tamsayı değeriniz varsa, bunu diğer tamsayılara ekleyebilir (veya diğer aritmetik işlemleri gerçekleştirebilir) veya bir tamsayı bağımsız değişkenini kabul eden işlevlere iletebilirsiniz. Bir nesne değeriniz varsa, üzerinde kendi sınıfı tarafından tanımlanan yöntemleri çağırabilirsiniz.

Bir sınıf, o sınıftaki nesnelerle neler yapabileceğinizi tanımladığından, sınıf bir türü tanımlar. Bir sınıf bundan daha fazlasıdır, çünkü aynı zamanda yöntemlerin nasıl uygulandığı (tür tarafından ima edilmeyen bir şey) ve nesne alanlarının nasıl düzenlendiği hakkında bir açıklama sağlar.

Ayrıca, bir nesne değerinin yalnızca bir sınıfa sahip olabileceğini, ancak her üst sınıf nesnenin sınıfında kullanılabilen işlevselliğin bir alt kümesini sağladığı için birden çok türe sahip olabileceğini unutmayın.

Bu nedenle, nesneler ve türler yakından ilişkili olsa da, gerçekten aynı şey değildir.


2

Int Float, char vb. Gibi C türleri, üzerinde çalışabilecek belirli yöntemlerle kullanılabilecek verileri tanımlar. Bundan daha karmaşık değil. İnt için olduğu gibi, toplama, çarpma ve belki bölmek olabilir. Bunlar int için yöntemlerim (veya işlemlerim). Sınıf basitçe yeni bir türün tanımıdır. Önce verilerin neye benzediğini tanımlarım. Belki de tek bir bit. Belki gerçek ve hayali kısmı olan bir kompleks gibi iki kelimedir. Veya belki de Jüpiter'deki garip bir parçacığın atomik yapısını temsil eden 309734325 bayt ile bu karmaşık şey. Umurumda değil. Tıpkı bir tamsayı gibi, bu yeni veri türüyle yapabileceğim işlemleri telafi ediyorum. Topladığım, çıkardığım vb. Tamsayı durumunda. Bu yeni veri türüyle, mantıklı olduğunu düşündüğüm işlemleri tanımlayabilirim. Bunlar çıkarma vb. Olabilir. ama başka şeyler de ekleyebilirler. Sınıfıma eklemeye karar verdiğim yöntemler bunlar.

Sonuç olarak, C'deki bir tür ile verilerin ne olduğunun bir tanımına sahip olmanızdır; Bayt, sözcük, kayan nokta, karakter vb. Ancak bunlardan herhangi biri hangi işlemlerin yasal olduğunu ve güvenilir sonuçlar üreteceğini ima eder.

Bir sınıf, arayüzü ve kabul edilebilir işlemleri tanımlamak size bağlı değildir. Sınıf bu şeyleri tanımlar ve bir Nesne'de başlattığınızda, tıpkı bir tür tanımının, üzerinde çalıştığınız zaman bir tamsayının davranışını tanımladığı gibi, nesnenin davranışını tanımlar.

Sınıflar size yeni türleri ve bunların nasıl çalıştığı hakkında her şeyi tanımlama esnekliği sağlar.

Bu tanımlandıktan sonra, "şey" sınıfındaki bir nesneyi her başlattığımda, tanımladığım veri yapısına ve onunla yapabileceğinizi söylediğim işlemlere (yöntemlere) sahiptir. "Thingy" sınıfı, açıkça C ++ 'nın tanımlamamı sağlayan yeni bir türden başka bir şey değildir.


1

Tip genellikle ilkel değerlerin sınıflandırmasını ifade eder - tamsayılar, dizeler, diziler, booleans, null, vb. Genellikle yeni türler oluşturamazsınız.

Sınıf , bir nesnenin oluşturulduğunda ilişkilendirildiği adlandırılmış özellik ve yöntem kümesini ifade eder. Bazı diller yeni bir nesne oluşturmanız ve daha sonra bu nesneye yöntemler eklemeniz gerekse de, genellikle istediğiniz kadar yeni sınıf tanımlayabilirsiniz.

Bu tanım çoğunlukla doğrudur, ancak bazı diller türleri ve sınıfları çeşitli şekillerde çeşitli faydalı sonuçlarla birleştirmeye çalışmıştır.


1
Yoksullaştırılmış C dilinde bile yeni türler yaratabilirsiniz, ancak yapıların, kayıtların ve sınıfların hepsinin birbirine benzemesi dışında normalde sınıf olarak düşündükleri gibi bir şey yoktur.
James Iry

1

Türler ve sınıflar birbiriyle ilişkilidir ancak özdeş değildir. Benim görevim sınıfların uygulama mirası olarak kullanılması, tiplerin ise çalışma zamanı ikamesi için kullanılması.

İşte açıklayan bir bağlantıdır ikame prensibi ve alt sınıfları ve alt tipleri (örneğin Java) her zaman aynı şey değildir neden. Wikipedia Kovaryans ve contravariance sayfa bu ayrım hakkında daha fazla bilgi vardır.


1

In genel dil-agnostik anlamda - Sınıf bir olduğunu gerçekleşme ait Tip .

Genellikle bu türün tek farkındalığı olduğunda , her iki terimi de bir bağlamda referans vermek için kullanabilirsiniz.

Aksine, örneğin, C # bağlamında - Sınıf adildir bir ait daha birçok uygulamaları a tipi ilkel, yapılar, işaretçileri vb gibi kavram


0

İlginç soru. Aku'nun cevabının yerinde olduğunu düşünüyorum. Java ArrayListsınıfını örnek olarak alalım

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

ArrayListSınıfın bir örneğinin, genişlettiği her üst sınıf ve uyguladığı her arabirim türünde olduğu söylenir. Bu nedenle, örnek ArrayListsınıfı bir tür olan ArrayList, RandomAccess, Cloneableve benzeri. Başka bir deyişle, değerler (veya örnekler) bir veya daha fazla türe aittir, sınıflar bu türlerin ne olduğunu tanımlar.


0

Farklı sınıflar aynı türü tanımlayabilir.

Tür şu parçalardan oluşur:

  1. İşlemler = sözdizimi
  2. İşlemlerin tanımı = anlambilim

Sınıf şu bölümlerden oluşur:

  1. İşlemler = sözdizimi
  2. Uygulama (= çeşitli uygulamalar aynı anlambilimi açıklar)

Bazı notlar:

  • Arayüz (Java'da olduğu gibi) tür değildir, çünkü anlambilimi tanımlamaz (yalnızca sözdizimini açıklar)

  • Alt sınıf alt tür değildir, çünkü alt sınıf üst sınıfta tanımlanan anlambilimi değiştirebilir, alt tür üst tür anlambilimini değiştiremez (bkz. Liskov İkame İlkesi, örneğin, bu LSP örneği ).


0

Açıkçası, OO programlama dili olmayan tip sistemli diller olduğundan, tür sınıftan daha geniş bir kavram olmalıdır

Java gibi dillerde bile, int (ilkel) bir türdür, ancak bir sınıf değildir.

Dolayısıyla: her sınıf bir türdür, ancak her tür bir sınıf değildir.


0

Bu soruyu C # bağlamında düşünürsek, aşağıdaki cevaba ulaşırız.

C # tipi sistem aşağıdaki kategorilere ayrılmıştır:

Değer türleri:

  • Basit tipler: int, uzun, şamandıra vb.
  • Numaralandırma türleri
  • Yapı türleri
  • Null olabilecek türler

Referans türleri:

  • Sınıf türleri
  • Arayüz türleri
  • Dizi türleri
  • Delege türleri

Gördüğünüz gibi C # 'da hangi sınıflardan sadece biri olan birçok tür var. Sadece bir önemli not vardır: C # 'in tip sistemi, herhangi bir tipteki değerin nesne olarak ele alınabileceği şekilde birleştirilmiştir. C # 'daki her tür, doğrudan veya dolaylı olarak nesne sınıfı türünden türetilir ve nesne, tüm türlerin nihai temel sınıfıdır. Referans türlerinin değerleri, değerleri tip nesnesi olarak görüntüleyerek nesneler olarak ele alınır. Değer türlerinin değerleri, boks ve kutudan çıkarma işlemleri gerçekleştirilerek nesne olarak değerlendirilir.

Gördüğüm gibi, tip bunlardan biri olan birçok öğenin üzerine bir şemsiye.

Referans: CSahrp Dil Spesifikasyonu doc, sayfa 4


-1

Bu benim için iyi bir soruydu, bu da beni zor düşündürdü. Sınıf bir compiletime thingy ve Type bir çalışma zamanı thingy olduğunu söylemeye cesaret ediyorum. Bunu söylüyorum çünkü tür değil sınıf yazıyorsunuz. Derleyici daha sonra sınıflardan türler oluşturur ve çalışma zamanı nesnelerin örneklerini oluşturmak için türleri kullanır.


1
SO hoş geldiniz. Bu cevap en az bir diğerine çok benziyor ve SO kullanıcıları 'şey' den daha fazla teknik dil tercih ediyor!
Nick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.