Yanıtlar:
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 .
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
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 .
Muz örneği.
Bir
Banana
tür genel olarak muzların özelliklerini ve işlevselliğini temsil eder.
ABCBanana
VeXYZBanana
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).
ABCBanana
Sınıf daha sonra belirli bir muz üretmek olabilir örnekleri arasındaABCBanana
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.
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
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:
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.
Type
(gösterildiği gibi büyük harfle yazılır), System.Type
türlerin açıklamalarını tutmak için kullanılan bir sistem sınıfının ( ) kısa adıdır .
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.
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.
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.
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 A
ve B
arabirimi 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 A
türdür A
ve IType
sınıf B
tü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
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.
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.
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.
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.
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
İlginç soru. Aku'nun cevabının yerinde olduğunu düşünüyorum. Java ArrayList
sınıfını örnek olarak alalım
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
Sı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 ArrayList
sınıfı bir tür olan ArrayList
, RandomAccess
, Cloneable
ve 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.
Farklı sınıflar aynı türü tanımlayabilir.
Tür şu parçalardan oluşur:
Sınıf şu bölümlerden oluşur:
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 ).
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:
Referans 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
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.