Ç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 fkod tabanındaki bin yer tarafından çağrılırken, f_implyü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 fveya 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 xgiriş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.