2011-02-04 10 views
1

が、私は機能デルファイ抽象関数は

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

を持っていると私は一時的にユニコードのための私のデータベース接続を橋渡しします

function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar; 
    Len: Integer): Integer; 

を追加しようとしていると言う基本クラスよりも、別の名前で呼び出します。

GetFieldNameを引き続き呼び出し、抽象化しないようにして、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は、Delphi 7でGetFieldNameと同じように動作します。GetFieldNameをUnicodeを使用して呼び出し、GetFieldNameAを呼び出して変換します。問題は、GetFieldNameが抽象であり、実装が全く異なるプロジェクトにあることです。これは奇妙な古いコードです。 –

+0

仮想抽象関数の実装が他のプロジェクトにある場合、あなたは本当にDS(問題の好みに応じて深刻な恐怖や悲惨な海峡に...)しています。あなたは確かに@ Robの解決策が必要になり、GetFieldNameA仮想抽象化を行い、実装ライブラリのメソッドの名前を変更します。ライブラリでGetFieldNameWというユニコードバージョンをコード化する場合は、少なくとも、Windows APIクックブックとDelphiの外部宣言から葉を取るような、基本クラスのGetFieldNameでどちらを呼び出すかを決めることができます。 –

答えて

6

いいえ、あなたはあなたが提案しているものを行うことはできません。私が終わる想像してる何

のようなものです。

代わりにGetFieldNameを上書きしてください。 GetFieldNameAを呼び出す前に、PCharPAnsiCharに変換してください(必要な場合)。後者は、実際にはoverrideである必要はありません。これは、通常の非仮想関数とすることができます。

この提案の残念な部分は、ごとにすべて子孫クラスで行う必要があるということです。代わりに、仮想抽象GetFieldNameAを基本クラスに追加してから、すべての子孫を変更してGetFieldNameの代わりにその子孫を上書きします。基本クラスのGetFieldNameを変更してGetFieldNameAを呼び出します。しかし、基本クラスを変更できない場合、それは非スターターです。

+0

私は完全に私の質問を台無しにしましたが、これは正解と思われます。 –

+0

したがって、私は大規模な改造なしでこれを逃れることができるとは思わない。クラップ –

1

あなたの質問を正しく理解していれば、置き換えられた基本クラスを注入してDelphiを騙すことができます。

GetFieldNameがTClass1と呼ばれ、元の宣言しているクラスは、その後、Unit1は(PASまたはDCU)で宣言された場合:

  • を(TrickUnit.pasを)新しいユニットを作ります。 TrickUnit.pasで
  • は、元のクラスと同じ名前のクラスを宣言し、古い用途セクションのクラス(TrickUnit.pasがUnit1はを使用しています)TrickUnit.pasで
  • のユニットを追加し、それを継承させます元のクラスtype TClass1 = class(Unit1.TClass1)
  • カスタム実装を追加してください。
  • ちょうど限りTrickUnit.pasが使用するセクションの端部にあるように、元のクラス

を期待する各ユニットの使用部(インターフェース部)の端であなたのすべてをTrickClass.pas を追加子孫はあなたの置き換えられたクラスを継承して終了するでしょう。using ......, TrickUnit

+0

インターセプタクラスのトリックは....汚いですが、動作します。 +1 –

関連する問題