私が直接あなたの質問に答えるのに十分最新のバージョンを持っているが、それはクラスが抽象的であるかどうか本当に問題ではないことに注意していません。コンパイラでは、クラスで直接コンストラクタを呼び出すのをやめさせるだけです。クラス参照をクラス参照変数に入れると、コンパイラーは変数のコンストラクターを呼び出すことができます。実行時にはインスタンス化できないクラスのインスタンスがあります。
var
c: TClass;
o: TObject;
begin
c := TMyAbstractClass;
o := c.Create;
Assert(o is TMyAbstractClass);
end;
本当に重要なのは、クラスがどの抽象メソッドを持っているかどうかです。あなたはそれをかなり簡単に確認することができます。クラスのVMTを見てください。 System._AbstractError
へのポインタを含む仮想メソッドスロットは抽象メソッドです。トリッキーな部分は、記録されていないので、チェックする仮想メソッドスロットの数を知ることです。 Allen Bauer demonstrated how to do thatの回答がanother questionになっていますが、Mason Wheelerのコメントでは、より大きな値が返される可能性があることを指摘しています。彼はJCLからGetVirtualMethodCount
関数を記述しています。これにより、より正確なユーザー定義の仮想メソッドが得られるはずです。その後、抽象クラスは何の抽象メソッドを持っていない場合は
function HasAbstractMethods(c: TClass): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to Pred(GetVirtualMethodCount(c)) do
if GetVirtualMethod(c, i) = @_AbstractError then
exit;
Result := False;
end;
、どのように抽象それは本当にすることができ:JCLからも、その機能とGetVirtualMethod
を使用して、我々は、この機能を取得しますか?開発者がそのインスタンスを作成できないようにするには、アブストラクトとマークされていなければなりませんが、実際に使用したい場合は、インスタンスを作成することができます。
この質問に与えられた答えは、ヘルプが役立つかもしれないこの質問に与えられた答えは、http://stackoverflow.com/questions/791004/how-can-i-detect-if-a-delphi-class-has-a-virtual-constructor。 – RobS