şablonlu türlerin, kavramın asıl ayrıntılarının türün sınıfı tarafından değil, tamamen şablon işlevinin / sınıfının uygulanmasıyla tanımlandığı bir "kavram" (Girdi Yineleyici, İleri Yönlendirici vb.) izlemesi gerekir. OOP'un biraz anti-kullanımı olan şablonla kullanılır.
Bence kavramların şablonlarla kullanım amacını yanlış anlıyorsunuz. Örneğin İleri Iterator, çok iyi tanımlanmış bir kavramdır. Bir sınıfın İleri Yineleyici olması için geçerli olması gereken ifadeleri ve hesaplama karmaşıklığı da dahil olmak üzere semantiklerini bulmak için standarda veya http://www.sgi.com/tech/stl/ForwardIterator.html adresine bakın. (hepsini görmek için Giriş, Çıkış ve Önemsiz Yineleyici bağlantılarını izlemeniz gerekir).
Bu belge son derece iyi bir arayüz ve "kavramın gerçek detayları" burada tanımlanıyor. Forward Iterator uygulamaları tarafından tanımlanmazlar ve Forward Iterator kullanan algoritmalar tarafından da tanımlanmazlar.
STL ve Java arasındaki arabirimlerin nasıl işlendiği arasındaki farklar üç katlıdır:
1) STL, nesneyi kullanarak geçerli ifadeleri tanımlar, Java ise nesne üzerinde çağrılabilir yöntemleri tanımlar. Elbette geçerli bir ifade bir yöntem (üye işlevi) çağrısı olabilir, ancak olması gerekmez.
2) Java arayüzleri çalışma zamanı nesneleridir, oysa STL kavramları RTTI ile bile çalışma zamanında görünmez.
3) Bir STL konsepti için gerekli geçerli ifadeleri geçerli hale getiremezseniz, tür ile bazı şablonlar başlattığınızda belirtilmemiş bir derleme hatası alırsınız. Java arabiriminin gerekli bir yöntemini uygulayamazsanız, bunu söyleyerek belirli bir derleme hatası alırsınız.
Bu üçüncü bölüm, bir tür (derleme zamanı) "ördek yazması" ndan hoşlanıyorsanız: arayüzler örtük olabilir. Java'da arayüzler biraz açıktır: bir sınıf "yalnızca" Yinelemeyi uyguladığını söylüyorsa yinelenebilir. Derleyici, yöntemlerinin imzalarının hepsinin mevcut ve doğru olup olmadığını kontrol edebilir, ancak anlambilim hala örtüktür (yani ya belgelenir ya da edilmez, ancak yalnızca daha fazla kod (birim testleri) uygulamanın doğru olup olmadığını söyleyebilir).
C ++ 'da, Python'da olduğu gibi, hem semantik hem de sözdizimi örtüktür, ancak C ++' da (ve güçlü yazılan önişlemciyi alırsanız Python'da) derleyiciden biraz yardım alırsınız. Bir programcı, uygulayıcı sınıf tarafından Java benzeri açık arabirim bildirimi gerektiriyorsa, standart yaklaşım tür özelliklerini kullanmaktır (ve çoklu kalıtım bunun çok ayrıntılı olmasını engelleyebilir). Java ile karşılaştırıldığında eksik olan şey, yazımla başlatabildiğim ve yalnızca gerekli tüm ifadeler yazım için geçerli olduğunda derlenecek tek bir şablon. Bu bana gerekli tüm bitleri "kullanmadan önce" uygulayıp uygulamadığımı söylerdi. Bu bir kolaylıktır, ancak OOP'nin çekirdeği değildir (ve hala anlambilimi test etmez,
STL, zevkinize göre yeterince OO olabilir veya olmayabilir, ancak kesinlikle arayüzü temiz bir şekilde uygulamadan ayırır. Java'nın arabirimler üzerinde yansıma yapma yeteneğinden yoksundur ve arabirim gereksinimlerinin ihlali farklı şekilde bildirilir.
İşlevi anlayabilirsiniz ... bir İleri Yineleyici yalnızca tanımına bakarak, uygulamaya ya da belgelere bakmanız gereken ...
Şahsen, uygun şekilde kullanıldığında örtük türlerin bir güç olduğunu düşünüyorum. Algoritma, şablon parametreleriyle ne yaptığını söyler ve uygulayıcı bu şeylerin çalışmasını sağlar: "arayüzlerin" ne yapması gerektiği tam olarak ortak paydadır. Dahası, STL ile, örneğin, std::copy
bir başlık dosyasında ileri bildirimini bulmaya dayalı olarak kullanmanız pek olası değildir . Programcılar , bir işlevin yalnızca işlev imzasına değil, belgelerine dayanarak ne aldığını da hesaplamalıdır. Bu C ++, Python veya Java için geçerlidir. Herhangi bir dilde yazarak neler yapılabileceğine dair sınırlamalar vardır ve yazmayı yapmadığı bir şeyi yapmak için kullanmaya çalışmak (anlambilimi kontrol etmek) bir hata olur.
Bununla birlikte, STL algoritmaları genellikle şablon parametrelerini hangi kavramın gerekli olduğunu açık bir şekilde adlandırır. Ancak bu, ileri bildirimleri daha bilgilendirici hale getirmek için değil, belgelerin ilk satırında yararlı ek bilgiler sağlamaktır. Bilmeniz gereken, parametre türlerinde kapsüllenebileceğinden daha fazla şey var, bu yüzden belgeleri okumalısınız. (Örneğin, bir giriş aralığı ve bir çıkış yineleyicisi alan algoritmalarda, çıkış yineleyicisinin, giriş aralığının büyüklüğüne ve belki de içindeki değerlere bağlı olarak belirli sayıda çıkış için yeterli "alana" ihtiyacı vardır. )
İşte açıkça beyan edilen arayüzlerde Bjarne: http://www.artima.com/cppsource/cpp0xP.html
Jenerikte bir argüman, jenerik tanımında belirtilen bir arabirimden (arabirime C ++ eşdeğeri soyut sınıftır) türetilmiş bir sınıftan olmalıdır. Bu, tüm genel argüman türlerinin bir hiyerarşiye sığması gerektiği anlamına gelir. Bu tasarımlar üzerinde gereksiz kısıtlamalar getirir, geliştiriciler açısından mantıksız öngörü gerektirir. Örneğin, bir genel yazarsanız ve bir sınıf tanımlarsam, belirttiğiniz arabirimi bilmiyor ve sınıfımı ondan türetmiş olmadıkça, insanlar sınıfımı jenerikinize argüman olarak kullanamazlar. Bu katı.
Diğer yöne baktığımızda, ördek yazarak arayüzün var olduğunu bilmeden bir arayüz uygulayabilirsiniz. Ya da birisi kasıtlı olarak bir arayüz yazabilir, böylece sınıfınız onu uygular ve dokümanlarınıza zaten yapmadığınız bir şey istemediklerini görmek için danışır. Bu esnek.