OOP, mql5의 템플릿 및 매크로, 미묘함 및 사용 기술 - 페이지 8

 
Alexey Navoykov :
당신은 그들의 표준 라이브러리 를 의미합니까? )

아니요, MQL에서는 구현 없이 추상 가상 메서드를 선언할 수 없습니다. MQL에서 기본 클래스 가상 메서드는 항상 구현해야 하며, 이는 언급한 문제로 가득 차 있습니다.

 
Ilya Malev :

동일한 C#에 너무 많은 기본 코어 인터페이스가 없습니다.

사실, 많이.

일리야 말레프 :

제 생각에는 모든 것이 그렇게 나쁜 것은 아닙니다. 제 생각에는 동일한 C#에 기본 메인 인터페이스가 많지 않기 때문에(저는 C# 전문가가 아닙니다.) 따라서 해당 메소드는 하나의 기본 수퍼클래스로 축소된 다음 누구에게나 상속될 수 없습니다.

추신 여러 IMHO를 구현하기 위해 <<<<>>>>와 같은 구성을 통해 이것은 어떻게든 한 곳을 통해 이루어집니다. 예를 들어 a==b는 a.compareto(b)를 호출하고 a[comparer]==b는 comparer.compare(a,b)를 호출하는 등 연산자를 통해 기능을 수행하는 것이 좋습니다.

IMHO, 끔찍한 혼란입니다.

+ 가상 메서드 호출은 무료가 아닙니다.
 
Vasiliy Sokolov :

아니요, MQL에서는 구현 없이 추상 가상 메서드를 선언할 수 없습니다. MQL에서 기본 클래스 가상 메서드는 항상 구현해야 하며, 이는 언급한 문제로 가득 차 있습니다.

구현 없이 선언할 수 없는 이유를 정말로 이해하지 못하셨습니까? 추상 클래스 메소드 는 몇 년 동안 MQL에서 지원되었습니다.

 
Vasiliy Sokolov :

1. 실제로 많이.

2. IMHO, 끔찍한 혼란이 드러날 것입니다.

+ 가상 메서드 호출은 무료가 아닙니다.

1. 알겠습니다.

2. 무슨 일이 일어나는지 보자. 내가 지금하고있는 일을 마음에 떠올리면 포럼에 게시 할 것입니다)

무료가 아닙니다. OOP를 통한 보편적인 솔루션은 비용이 많이 들지만 목표가 일반 Expert Advisors 및 지표(종소리와 휘파람 없이)를 쉽고 아름답게 구축하는 것이라면 IMHO는 그만한 가치가 있습니다.

 
Alexey Navoykov :

구현 없이 선언할 수 없는 이유를 정말로 이해하지 못하셨습니까? 추상 클래스 메소드 는 몇 년 동안 MQL에서 지원되었습니다.

이러한 항목은 컴파일 오류로 이어지기 때문입니다.

 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 :

이러한 항목은 컴파일 오류로 이어지기 때문입니다.

예, 이해할 수 있습니다. 그리고 그 사람은 내가 그의 게시물에서 이해하는 한 MQL에서 그러한 메소드를 선언하는 것이 일반적으로 불가능하다고 생각했습니다.

 

아는 사람은 거의 없지만(알고 사용하는 사람은 훨씬 더 적음) 순수한 가상 함수 는 본체를 가질 수 있습니다.

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

또한 자손 클래스에서 오버로드되어야 합니다.

 
Ilyas :

아는 사람은 거의 없지만(알고 사용하는 사람은 훨씬 더 적음) 순수한 가상 함수 는 본체를 가질 수 있습니다.

또한 하위 클래스에서 오버로드되어야 합니다.

인터페이스는 모두 동일한 메서드 코드를 가질 수 있습니까? 그를 부를 방법이 있습니까? )

최근에 이것을 발견했습니다 ...

 
흠, 흥미로운 기능이군요... 제가 알기로는 이것이 기본 구현이며 후손에서 A::f2()로 호출할 수 있습니다. 저것들.:
 class B : public A
{
   virtual int f2() { return A::f2(); }
};
ps 지금 해봤는데... A::f2() 에 본문이 없어도 컴파일러는 그런 호출에 전혀 반응하지 않습니다. 저것들. 그런 다음 런타임에 오류를 잡아야 합니다. 네, 그렇게 삽니다.
 
Alexey Navoykov :
흠, 재미있는 기능이군요... 제가 알기로는 상속인에서 A::f2()를 단순히 호출하는 기본 방법입니다.

테스트됨 - 일반적으로 옳습니다 =)

알렉세이 나보이코프 :
ps 지금 해봤는데... A::f2() 에 본문이 없어도 컴파일러는 그런 호출에 전혀 반응하지 않습니다.
나는 "스택 오버플로"에 반응했습니다)

바퀴벌레인듯...

 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());
 }