2011-02-04 2 views
1

함수가 있습니다.기본 클래스와 다른 이름으로 Delphi 추상 함수 호출

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; virtual; abstract; 

를 추가하려고합니다.
function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar; 
    Len: Integer): Integer; 

그러면 데이터베이스 연결이 일시적으로 유니 코드에 연결됩니다.

GetFieldName을 계속 호출하여 추상화하지 않고 GetFieldNameA를 호출하기 위해 약간의 바이트 변환을 수행합니다. GetFieldNameA는 첫 번째 GetFieldName의 기술적 추상 버전이됩니다. (나는 기본 클래스를 전혀 바꾸고 싶지 않다.)

외부 참조에 'name'키워드를 추가하는 것과 같은 방법으로 서브 클래스에 다른 이름을 가진 추상 함수를 가질 수 있습니까?

내가 끝내고 있다고 생각하는 것은 다음과 같습니다.

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; 
function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar; 
    Len: Integer): Integer name 'GetFieldName Virtual Abstract'; 
+0

정확히 달성하려는 것은 무엇입니까?실제로 GetFieldName을 사용하는 코드를 변경하지 않고도 GetFieldName에있는 (재정의 된) 구현의 현재 계층 구조를 GetFieldNameA의 (오버라이드 된) 구현 계층 구조로 이동하려고합니까? –

+0

@marjan GetFieldNameA (및 다른 함수의 호스트) GetFieldName 델파이 7 않았다 같은 기능을 추가하려면 노력하고있어. GetFieldName 유니 코드를 사용하여 호출 할, 변환 및 GetFieldNameA 호출 할. 문제는 GetFieldName이 추상이고 구현이 완전히 다른 프로젝트에 있다는 것입니다. 이것은 이상한 오래된 코드입니다. –

+0

가상 추상 기능의 구현이 다른 프로젝트에있는 경우, 실제로 DS (문제의 선호도에 따라 깊은 똥이나 무서운 해협)에 있습니다. 실제로 Rob의 솔루션이 필요하거나 GetFieldNameA 가상 추상화를 수행하고 구현 라이브러리의 메소드 이름을 바꿉니다. 그런 다음 유니 코드 버전을 라이브러리에서 GetFieldNameW로 코딩하면 기본 클래스의 GetFieldName에서 호출 할 결정을 적어도 유지할 수 있습니다. 이는 Windows API 요리 책과 Delphi의 외부 선언에서 잎을 취하는 것과 같습니다. –

답변

6

아니, 당신은 당신이 제안하고 무엇을 수행 할 수 없습니다 내가 함께 끝나는 상상있어 무엇

은 같은 것입니다.

대신 GetFieldName을 재정의하십시오. GetFieldNameA으로 전화하기 전에 PCharPAnsiChar (필요한 경우)으로 변환 했습니까? 후자는 실제로는 override으로 표시 될 필요는 없습니다. 일반적인 비 가상 함수가 될 수 있습니다.

그 제안의 불행한 부분은 마다 자손 클래스에서 수행해야한다는 것입니다. 가상 클래스 GetFieldNameA을 기본 클래스에 추가 한 다음 GetFieldName 대신 모든 자손을 재정의하여 대체 할 수 있습니다. 기본 클래스의 GetFieldName을 변경하여 GetFieldNameA으로 호출하십시오. 하지만 기본 클래스를 변경할 수 없다면 이는 비 스타터입니다.

+0

나는 완전히 내 질문에 혼란 스럽지만 이것이 올바른 대답 인 것으로 보인다. –

+0

따라서, 나는 거대한 개조 없이는 이것을 벗어날 수있을 것이라고 생각하지 않는다. 쓰레기. –

1

질문을 올바르게 이해했다면 대체 된 기본 클래스를 주입하여 Delphi를 속일 수 있습니다. 원래 GetFieldName을을 선언하는 클래스가 TClass1 호출되면

는, 유니트 1 (PAS 또는 DCU)에 선언 :

  • 새로운 단위 (TrickUnit.pas)를 확인하십시오. TrickUnit.pas에서
  • 원래 클래스와 동일한 이름으로 클래스를 선언 이전 용도 섹션 클래스 (TrickUnit.pas이 유니트 1을 사용)을 TrickUnit.pas에서
  • 단위를 추가가 상속 할 원래 클래스 type TClass1 = class(Unit1.TClass1)
  • 은 사용자 정의 구현을 추가하고 추가합니다. TrickUnit.pas가 사용 섹션의 마지막 부분에 그대로
  • 는 그냥만큼 원래 클래스

을 예상하고 각 단위의 사용 부분 (인터페이스 부분)의 끝에서 모든 TrickClass.pas 를 추가하려면 자손은 코드 변경없이 대체 된 클래스를 상속 받게됩니다. using ......, TrickUnit

+0

인터셉터 클래스 트릭 .... 더러워 지지만 작동합니다. +1 –

관련 문제