내가 직접 귀하의 질문에 대답 할만큼 최근의 버전을 가지고 있지만, 그것은 클래스가 추상적인지하지 정말 문제를 않는다는 것을 명심하지 않습니다. 컴파일러가 클래스에서 직접 생성자를 호출하지 못하도록합니다. 클래스 참조를 클래스 참조 변수에 넣으면 컴파일러에서 변수에 대해 생성자를 호출 할 수있게하고 실행시에는 인스턴스화 할 수없는 클래스의 인스턴스를 갖게됩니다. 정말 중요한 무엇
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의 의견에 따르면 더 큰 값을 반환 할 수 있다고 지적합니다. 그는 GetVirtualMethodCount
함수를 JCL에서 언급 했으므로 사용자 정의 가상 메서드를 더 정확하게 계산해야합니다. 다음 추상 클래스는 더 추상적 인 방법이없는 경우
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