Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 21

 
fxsaber :

Sonuçta, istenen tür için GetHashCode'u aşırı yüklemeye ve IEqualityComparable'ı çitlemeye başlamamaya başlar.

Bu durumda, uçlar çok ileri gider ve kütüphanenin bağırsaklarında bir yerde olası bir hata meydana gelir. Ve orada bir işlevin neden bulunamadığını ve kimin hatası olduğunu tahmin edin. Ve arayüzler, gerekli tüm fonksiyonların önceden nesnede tanımlanmış olmasını sağlar.

 
Alexey Navoykov :

Bu durumda, uçlar çok ileri gider ve kütüphanenin bağırsaklarında bir yerde olası bir hata oluşur. Ve orada bir işlevin neden bulunamadığını ve kimin hatası olduğunu tahmin edin. Ve arayüzler, gerekli tüm fonksiyonların önceden nesnede tanımlanmış olmasını sağlar.

MqlTick için bir örnek gösterebilir misiniz?

 
Alexey Navoykov :

Ve arayüzler, gerekli tüm fonksiyonların önceden nesnede tanımlanmış olmasını sağlar.

evet, yalnızca bu sınıflar evrensel olduğunu iddia eder ve kutudan çıktığı gibi her tür için çalışmalıdır.

 
fxsaber :

MqlTick için bir örnek gösterebilir misiniz?

 class CMqlTick : public IEqualityComparable<CMqlTick*>
{
 public : 
   MqlTick _tick;
   bool     Equals(CMqlTick* obj) { return obj!= NULL && obj._tick.time==_tick.time; }
   int      HashCode( void )        { return _tick.time; }
};
Burada, elbette, sınıfa yerleştirilmesi gereken genel giderler ve ayrıca işaretçinin kontrolü var.
 
Alexey Navoykov :
Burada, elbette, sınıfa yerleştirilmesi gereken genel giderler ve ayrıca işaretçinin kontrolü var.

Teşekkürler, ancak bu yaklaşımın pratikte avantajının ne olduğunu anlamıyorum?

SB'de böyle bir kod

 //+------------------------------------------------------------------+
//| Class CKeyValuePair<TKey, TValue>.                               |
//| Usage: Defines a key/value pair that can be set or retrieved.    |
//+------------------------------------------------------------------+
template<typename TKey,typename TValue>
class CKeyValuePair: public IComparable<CKeyValuePair<TKey,TValue>*>
  {
protected :
   TKey              m_key;
   TValue            m_value;

public :
                     CKeyValuePair( void )                                              {   }
                     CKeyValuePair(TKey key,TValue value ): m_key(key), m_value( value ) {   }
                    ~CKeyValuePair( void )                                              {   }
   //--- methods to access protected data
   TKey              Key( void )           { return (m_key);   }
   void               Key(TKey key)       { m_key=key;       }
   TValue            Value( void )         { return (m_value); }
   void               Value(TValue value ) { m_value= value ;   }
   //--- method to create clone of current instance
   CKeyValuePair<TKey,TValue>*Clone( void ) { return new CKeyValuePair<TKey,TValue>(m_key,m_value); }
   //--- method to compare keys
   int                Compare(CKeyValuePair<TKey,TValue>*pair) { return ::Compare(m_key,pair.m_key); }
   //--- method for determining equality
   bool               Equals(CKeyValuePair<TKey,TValue>*pair) { return ::Equals(m_key,pair.m_key); }
   //--- method to calculate hash code   
   int                HashCode( void ) { return ::GetHashCode(m_key); }

Önerilen dansların yalnızca bu GetHashCode'u aşırı yüklememek için olduğu ortaya çıktı. Ama bu durumda oyun muma değer mi?

 
fxsaber :

Teşekkürler, ancak bu yaklaşımın pratikte avantajının ne olduğunu anlamıyorum?

SB'de böyle bir kod

Önerilen dansların yalnızca bu GetHashCode'u aşırı yüklememek için olduğu ortaya çıktı. Ama bu durumda oyun muma değer mi?

Hız kritikse, aşırı yüklemek muhtemelen daha iyidir.

Sonuç olarak, bu kitaplığın taşındığı .NET'te, tüm yerleşik türlerin başlangıçta zaten arabirimleri vardır. İnt, yani Int32 şu şekilde tanımlanır:

 public struct Int32 : IComparable, IFormattable, IConvertible, 
        IComparable< int >, IEquatable< int >

Bu nedenle, orada aşırı yüklenme yoktur.

Ve CKeyValuePair sınıfının kendisi biraz farklı olarak bildirilmiş olurdu.

Eh, burada MQL'nin sınırlı yeteneklerinin izin verdiği ölçüde tüm bunları uygulamaya çalışıyorlar. Her ne kadar bu zamanı dilin işlevselliğini geliştirmeye harcamak daha iyi olsa da. O zaman tüm .Net kütüphanesini kopyala-yapıştır yapmak yeterli olacaktı ve her şey işe yarayacaktı.

 
Alexey Navoykov :
Burada, elbette, sınıfa yerleştirilmesi gereken genel giderler ve ayrıca işaretçinin kontrolü var.
ve bu kodu GetHashCode aşırı yüklemesine zorlamanın sorunu nedir? o zaman arayüzden miras almak gerekli değildir
 
birleştirici :
ve bu kodu GetHashCode aşırı yüklemesine zorlamanın sorunu nedir? o zaman arayüzden miras almak gerekli değildir

Tabii ki mümkün. Ancak bu, süreci kontrol etmeyi zorlaştırıyor. Diyelim ki, kod boyunca dağılmış bir sürü farklı GetHashCode'unuz var ve hangisinin burada çağrıldığını (ve nerede olduğunu) anlamak zor olabilir. Örneğin, bir işlev çağrıldığında, argüman başka bir türe dönüştürülür. C#'da, görünüşe göre, bu nedenle, şablonların olanakları C++ ile karşılaştırıldığında kısıtlanmıştır.

 
Alexey Navoykov :

Tabii ki mümkün. Ancak bu, süreci kontrol etmeyi zorlaştırıyor.

iyi. C++'da bu arayüze gerek yoktur, normal etkileşim sadece < operatörünün aşırı yüklenmesiyle sağlanır ve bu operatör SINIF DIŞINDA tanımlanabilir.

bence bu tür yapıları geri çevirmekten çok daha basit ve özlü. ancak sınıfın dışında < operatörünü aşırı yüklemek için yerel desteğe ihtiyacımız var.

ve yerleşik yapılar için GetHashCode aşırı yüklenmesinden başka bir şey kalmaz, çünkü saplama korkunç ve miras almanın bir yolu yok. bir yapıdan miras almak bir koltuk değneği çözümüdür, çünkü standart işlevleri kullanırken, her şeyin istendiği gibi sürmesi için yapıyı özel bir varise manuel olarak atmaya zorlar.
 
birleştirici :

bir yapıdan miras almak bir koltuk değneği çözümüdür, çünkü standart işlevleri kullanırken, her şeyin istendiği gibi sürmesi için yapıyı özel bir varise manuel olarak atmaya zorlar.

Görünüşe göre kalıtım değil, bir sınıftan bir yapı üzerindeki bir sarmalayıcı mı demek istiyorsun?

Aslında, böyle bir "zorlama" aynı zamanda MQL işlevselliğinin bir dezavantajıdır, çünkü Cast operatörünü aşırı yükleme olasılığı yoktur. Aksi takdirde, sınıf örtük olarak yapıya kolayca aktarılır.

Genel olarak, dilin rafine edilmesi ve rafine edilmesi gerekir. Ama nedense kimse kaşınmıyor... 2 yıldır gelişimde bir durgunluk, hiçbir iyileştirme ve yenilik yok.

Buradaki geliştiricilerin kendilerinin çoklu arayüz ve diğer özelliklerin eksikliğinden şikayet etmelerine rağmen, kaktüs yemeye devam ediyorlar)

Neden: