2014-07-14 1 views
1

델파이 클래스 함수를 오버로드하는 방법 :이 같은 (2007 년) 수준의 기능 델파이가

Class Function InitGlobal : TForm; Overload; Virtual; Abstract; 

일부 자손 클래스에서 내가하려고 :

Class Function InitGlobal : TDescendentForm; Overload; Override; 

그러나 델파이가 TDescendentForm.InitGlobal 다르다 불만을 이전 선언에서 ("Overload"지시문을 눌러도).

함수 결과 유형을 오버로드 할 수 없다고 생각합니다. 어떤 경우에 그러한 과부하를 정의하는 올바른 방법은 무엇입니까?

Function overloading by return type?을 확인했지만, 델파이에 대한 언급없이 이러한 과부하를 만드는 것에 대한 단점과 찬성에 대해 언급합니다.

+0

을하지만, 동시에 모두를 수행 할 수 없습니다

구현은 다음과 같이 나타납니다. 'overload'는 다른 메소드 시그니처를 가질 필요가있는 반면,'override'는 메소드가 파생 된 타입과 같은 이름의 메소드를 대체 할 것이라는 것을 나타냅니다. 아마도 더 자세한 코드 샘플이 도움이 될 것입니다. –

+0

귀하의 의견은 부적합합니다 @. 사실은 동시에 둘 다 할 수 있다는 것입니다. RTL 및 VCL에서 여러 번 발생합니다. –

+0

정보를 주셔서 감사합니다, @ RobKennedy. 오버로드는 주어진 행동에 대해 서로 다른 매개 변수만을 정의하는 메소드가 될 것이고, 오버라이드는 객체의 행동을 재정의하는 메소드가 될 것으로 항상 예상했기 때문에 나는 지금까지 두 가지를 동시에 해왔다. 나는 그 두 가지를 한 번도 해 본 적이 없으며, 어떻게 든 그것을 설계 결함으로 생각하는 경향이 있습니다. 하지만 RTL 및 VCL에서 여러 번 수행된다고 말하면 단순히 필요하지 않은 어떤 이유로 좋을 것입니다. =) –

답변

3

함수 오버로드는 반환 값이 아닌 매개 변수를 기반으로해야합니다. 반환 값만 다른 두 가지 오버로드를 가질 방법이 없습니다.

그래도 할 수 있더라도 override을 사용하려고 시도하고 함수의 서명을 변경하려고합니다. 그것은 또한 불가능합니다. 오버라이드는 오버라이드 할 함수와 동일한 서명을 가져야합니다.

할 수있는 일은 기능을 재정의하고 동일한 서명을 유지하는 것입니다. overload 명령어를 삭제할 수 있습니다. 그런 다음 파생 된 함수는 다음과 같습니다

class function InitGlobal: TForm; override; 

을 이제 TDescendentForm의 인스턴스를 반환 당신을 막을 아무것도 없다. 여전히 TForm입니다. 여기서 수행 할 작업은 런타임에 더 파생 된 유형을 반환하는 것입니다. 당신도``overload` 또는 override`, 내 소견에서

Result := TDescendentForm.Create(...); 
// compile time type of Result is TForm, but that is assignment compatible 
// at run time with an instance of TDescendentForm 
+0

물론, 그는 TDescendentForm을 반환 할 수 있지만, InitGlobal을 호출하는 코드는이 사실을 모르고 TDescendentForm으로 캐스팅하지 않는 한 TDescendentForm의 항목에 액세스 할 수 없습니다 (예 :'as '사용). 어쨌든 TDescendentForm을 알고 있다면, 다형성의 이점은 상실되고 함수는 전혀 가상 일 필요는 없습니다. –

+0

@Rudy 그러나 인스턴스의 모든 가상 메서드를 반환 할 수 있습니다. 파생 된 클래스 비헤이비어를 활용하려면 컴파일 타임에 형식을 알 필요가 없습니다. –

+0

David가 말했듯이 오버로드는 매개 변수 시그니처에 대해서만 작동하며 반환 값으로 사용되지 않으므로 Rudy가 제안한 것처럼 덜 우아한 솔루션이 사용됩니다. TDescendantForm (TDescendantForm.InitGlobal()). SomeMethodInDescendant.결과 형식의 오버로드가 허용되면 첫 번째 캐스트가 제거되어 더 명확한 코드가됩니다. – alvaroc

관련 문제