Çoklu kalıtımın yoğun kullanımını sağlamak için tasarlanmış bir koddan yararlanan tipik sorun kalıpları nelerdir?
Bu sadece bir örnektir, ancak güvenliği arttırmak ve arayanlar veya alt sınıflar boyunca basamaklı değişiklikler uygulamak için cazipleri azaltmak için çok değerli bulduğum bir örnek.
En soyut, durumsuz arayüzler için bile çoklu kalıtımın son derece yararlı bulduğum yerde, C ++'daki sanal olmayan arayüz deyimi (NVI).
Sözleşmelerin evrensel yönlerini uygulamak için kendilerine biraz uygulama yapan arayüzler kadar soyut temel sınıflar bile değiller, çünkü sözleşmenin genelliğini daha iyi uygulayacak kadar daraltmıyorlar. .
Basit bir örnek (bazıları iletilen bir dosya tanıtıcısının açık olduğunu veya bunun gibi bir şeyi kontrol edebilir):
// Non-virtual interface (public methods are nonvirtual/final).
// Since these are modeling the concept of "interface", not ABC,
// multiple will often be inherited ("implemented") by a subclass.
class SomeInterface
{
public:
// Pre: x should always be greater than or equal to zero.
void f(int x) /*final*/
{
// Make sure x is actually greater than or equal to zero
// to meet the necessary pre-conditions of this function.
assert(x >= 0);
// Call the overridden function in the subtype.
f_impl(x);
}
protected:
// Overridden by a boatload of subtypes which implement
// this non-virtual interface.
virtual void f_impl(int x) = 0;
};
Bu durumda, belki f
kod tabanındaki bin yer tarafından çağrılırken, f_impl
yüz alt sınıf tarafından geçersiz kılınır.
Bu tür güvenlik kontrolünü çağıran her 1000 yerde f
veya geçersiz kılan 100 yerde yapmak zor olacaktır f_impl
.
Sadece bu girişi sanal olmayan işlevselliğe işaret ederek, bana bu kontrolü yapmak için tek bir merkezi yer verir. Ve bu kontrol, sadece bu işlevi çağırmak için gereken bir önkoşul olduğunu iddia ettiği için soyutlamayı en ufak bir şekilde azaltmaz. Bir bakıma, arayüz tarafından sağlanan sözleşmeyi tartışmalı olarak güçlendiriyor ve x
girişi geçersiz kılan tüm 100 yerde geçerli ön koşullara uyduğundan emin olmak için girişi kontrol etme yükünü hafifletiyor .
Her dilin C ++ 'da bile yerel bir kavramdan biraz daha fazla olmasını dilediğim bir şey (ör: geçersiz kılmak için ayrı bir işlev tanımlamamızı gerektirmez).
Bu assert
önceden yapmadıysanız son derece kullanışlıdır ve daha sonra kod tabanındaki bazı rastgele yerlerin iletilen negatif değerlerle karşılaştığı zaman gerekli olduğunu fark ettiniz f
.