OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 8

 
Alexey Navoykov :
Standart kütüphanelerini mi kastediyorsunuz? )

Hayır, MQL'de uygulama olmadan soyut bir sanal yöntem bildiremezsiniz. MQL'de, temel sınıf sanal yöntemlerinin her zaman bahsettiğiniz problemlerle dolu bir uygulaması olmalıdır.

 
Ilya Malev :

Aynı c#'ta çok fazla temel çekirdek arabirimi yok

Aslında, çok.

İlya Malev :

Bana göre, her şey o kadar da kötü değil. Bence aynı C# içinde çok fazla temel ana arabirim yok (C# uzmanı değilim), bu nedenle yöntemleri tek bir temel üst sınıfa indirgenemez ve ardından herhangi biri tarafından miras alınamaz.

not Birden fazla IMHO uygulamak için <<<<>>>> gibi yapılar aracılığıyla bu bir şekilde tek bir yerden olur. İşlevleri operatörler aracılığıyla yapmak daha iyidir, örneğin, a==b a.compareto( b ) öğesini çağırır, a[comparer]==b Comparer.compare(a,b) öğesini çağırır, vb.

IMHO, korkunç bir karmaşa.

+ Sanal yöntemleri çağırmak ücretsiz değildir.
 
Vasiliy Sokolov :

Hayır, MQL'de uygulama olmadan soyut bir sanal yöntem bildiremezsiniz. MQL'de, temel sınıf sanal yöntemlerinin her zaman bahsettiğiniz problemlerle dolu bir uygulaması olmalıdır.

Uygulama olmadan ilan etmenin neden imkansız olduğunu gerçekten anlamadınız mı? Soyut sınıf yöntemleri , MQL'de birkaç yıldır desteklenmektedir.

 
Vasiliy Sokolov :

1. Aslında çok.

2. IMHO, korkunç bir karmaşa ortaya çıkacak.

+ Sanal yöntemleri çağırmak ücretsiz değildir.

1. bileceğim.

2. Bakalım ne olacak, şimdi ne yaptığımı aklıma getirirsem foruma yazarım)

Ücretsiz değil, evet. OOP aracılığıyla herhangi bir evrensel çözümün pahalı olduğu ortaya çıkıyor, ancak amaç sıradan Uzman Danışmanları ve göstergeleri (çan ve ıslık olmadan) kolayca ve güzel bir şekilde oluşturmaksa, IMHO buna değer.

 
Alexey Navoykov :

Uygulama olmadan ilan etmenin neden imkansız olduğunu gerçekten anlamadınız mı? Soyut sınıf yöntemleri , MQL'de birkaç yıldır desteklenmektedir.

Çünkü böyle bir giriş derleme hatasına yol açacaktır:

 class A
 {
public :
   virtual int f1() = 0 ;
   virtual int f2() = 0 ;
 };
 
class B: public A
 {
public :
   virtual int f1(){ return 1 ; } 
 };
 
void OnStart ()
 {
   B b;
 }


 
Ilya Malev :

Çünkü böyle bir giriş derleme hatasına yol açacaktır:

Evet, bu anlaşılabilir. Ve kişi, mesajından anladığım kadarıyla MQL'de böyle bir yöntemi ilan etmenin genellikle imkansız olduğunu düşündü.

 

Çok az insan biliyor (bilen ve kullanan daha da az), ancak saf sanal işlevlerin bir bedeni olabilir.

 class A
 {
public :
   virtual int f1() = 0 ;
   virtual int f2() = 0 { return ( 0 ); }
 };

Ayrıca soyundan gelen sınıfta aşırı yüklenmeleri gerekir.

 
Ilyas :

Çok az insan biliyor (bilen ve kullanan daha da az), ancak saf sanal işlevlerin bir bedeni olabilir.

Ayrıca soyundan gelen sınıfta aşırı yüklenmeleri gerekir.

Bu, arayüzlerin hepsi aynı yöntem koduna sahip olabilir mi? Onu aramanın bir yolu var mı? )

Az önce bununla karşılaştım...

 
Hmm, ilginç bir özellik... Anladığım kadarıyla, bu, soyundan gelenlerde A::f2() olarak adlandırılabilecek varsayılan uygulamadır. Onlar.:
 class B : public A
{
   virtual int f2() { return A::f2(); }
};
ps Şimdi denememe rağmen... A::f2()'nin gövdesi olmasa bile, derleyici böyle bir çağrıya hiçbir şekilde tepki vermiyor. Onlar. daha sonra çalışma zamanında hatayı yakalamanız gerekir. Evet, böyle nafig.
 
Alexey Navoykov :
Hmm, ilginç bir özellik... Anladığım kadarıyla, varislerde A::f2() öğesini çağırmak için varsayılan yöntem bu.

Test edildi - genel olarak haklısınız =)

Alexey Navoykov :
ps Şimdi denememe rağmen... A::f2()'nin gövdesi olmasa bile, derleyici böyle bir çağrıya hiçbir şekilde tepki vermiyor.
"Yığın taşmasına" tepki verdim")

Hamamböceği gibi görünüyor...

 class A
 {
public :
   virtual int f1() = 0 { return 1 ; }
   virtual int f2() = 0 ;
 };
 
class B: public A
 {
public :
   virtual int f1(){ return A::f1(); } 
   virtual int f2(){ return A::f2(); } 
 };
 
void OnStart ()
 {
   A*a= new B;
   Print (a.f1());
   Print (a.f2());
 }