2011-05-04 5 views
0

클래스 추가가 필요한 IFlow (TFieldType1 및 TFieldType2)의 하위 항목 인 클래스 TRow = class (TInterfaceList) 나는 반복 할 메소드가 있습니다. 항목을 통해 IField 메서드를 호출하십시오.더 많은 유형을 지원하기 위해 Delphi - TInterfaceList 하위 클래스 - 추상 오류

(Item[i] as IField).IFieldMethod 

그리고 나는 추상적 인 오류가 나타 납니까? 내가 뭘 잘못하고 있니? OOP 이해 또는 Delphi에서 잘못 되었습니까?

답변

1

당신은 abstract virtual 방법을 사용하여 IField.IFieldMethod를 구현하는 클래스를 가지고 감사, 당신은 Constructing instance of <TType> containing abstract method <MethodName> 무시했습니다.

다음은 오류를 보여주는 간단한 콘솔 데모 코드입니다. (Item[i] as IField).IFieldMethod을 사용하여 IFieldMethod을 호출한다는 사실은 새로운 정보를 제공하지 않으며 문제의 원인 만 숨 깁니다. 로컬 변수에 IField 형 인터페이스 참조를 저장하고 당신이 내 코드를 가지고 :

program Project23; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Classes; 

type IDummyIntf = interface 
    procedure DoStuff; 
end; 

type TDummyImp = class(TInterfacedObject, IDummyIntf) 
    procedure DoStuff;virtual;abstract; // TDummyImp implements IDummyIntf.DoStuff using a VIRTUAL ABSTRACT method. 
end; 

var X: IDummyIntf; 
begin 
    X := TDummyImp.Create; // <-- Warning at this line, Constructing instance of TDummyImp containing abstract method TDummyImp.DoStuff 
    X.DoStuff; // This raises EAbstractError because TDummyImp doesn't actually implement DoStuff 
    ReadLn; 
end. 
+0

I의 잘못은 읽기 문제를 내가 내 바보 같은 대답을 삭제하기 전에 다음 내 인터넷 연결이 사망했다. 이제 돌아 왔으므로 올바른 답을 주셨습니다. +1 –

+0

참. IField 및 TFieldType1을 구현하는 TField와 IFieldMethod가 가상 인 TField를 구현하는 TFieldType2가 있습니다. 추상; TField에서. 나는 무시하려고하지 않는다. TFieldType1 및 FieldType2의 메소드 이것은 내 오류입니다. 유사한 오류를 찾아 보는 누군가가 이해할 수 있도록이 설명을 쓰고 있습니다. 감사합니다. – elector

+1

**주의 : 메타 클래스를 통해 간접적으로 클래스를 인스턴스화하면 컴파일러는 추상 메소드에 대한 경고를 발행하지 않습니다 (더 이상 문제를 감지 할 수 없기 때문에). –