2013-10-30 3 views
7

현재 컴파일 오류가 발생했습니다. 아무도 저희 회사에서 도움을 줄 수 없으며 슬프게도 SO 또는 Google에 대한 정확한 검색 패턴을 찾지 못했습니다.델파이 - 제네릭을 사용한 인터페이스 상속

코드에서 상속 된 2 개의 인터페이스와 상속 된 2 개의 클래스를 사용하고 있습니다.

program Project22; 

{$APPTYPE CONSOLE} 
type 
    IStorageObject = interface(IInterface) 
    end; 
    TObjectStorage<T: IStorageObject> = class(TObject) 
    end; 
    IKeyStorageObject<TKey> = interface(IStorageObject) 
    end; 
    TKeyObjectStorage<TKey, T: IKeyStorageObject<TKey>> = class(TObjectStorage<T>) 
    end; 
    TImplementingClass<TKey> = class(TInterfacedObject, IKeyStorageObject<TKey>) 
    end; 
begin 
    TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create; 
end. 

'TKeyObjectStorage'에 대한 컴파일러 오류는 다음과 같습니다 : 다음 코드는 오류를 재현

[DCC Error] Project22.dpr(11): E2514 Type parameter 'T' must support interface 'IStorageObject'

나는 컴파일러가 인식되지 않는다는 생각 무슨 클래스 'TKeyObjectStorage의 매개 변수 T '제대로. 원하는 유형 'IKeyStorageObject'에 상위 유형 IStorageObject가 있으므로 올바른 값이어야합니다.

왜 작동하지 않습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 델파이에서는 이것이 불가능합니까?

+0

을! :

documentation이 마음에게 정보를 포함하고 있는가? 그 콤마를 세미콜론으로 바꾸셨습니까? !! 그리고 게시 한 코드가 여전히 오류를 표시하기에 충분하지 않습니다.제발 ** 제안한 일을하고 ** 완전한 프로그램 **을 게시하십시오. 내 대답에서 당신을 보여 줬어. –

+0

이 데이비드를 유감스럽게 생각합니다. 그렇습니다. 그러나 ','는이 오류를 던지지 않았으며 단지 사소한 감독이었습니다. 다시 시끄러워. – Hugie

+0

@ 휴지 (Hugie), 원래의 문제에서 벗어나기 위해 질문을 변경하지 마십시오. 원래의 모든 오류는 질문에 머물러 있어야합니다. 그러나 최소한의 코드로 콘솔 앱을 만들어 문제를 시연하십시오. 붙여 넣기 ** 해당 ** 콘솔 애플 리케이션의 질문에. – Johan

답변

9

업데이트

원래의 질문 (아래 참조) 나는 식별되는 문제가 있었다. 그러나 거기에 설명 된 수정 프로그램은 XE3 이상에서는 좋지만 아래 프로그램은 XE2에서 컴파일되지 않습니다. 따라서 이것이 XE2 제네릭 컴파일러 버그라고 결론을 내립니다.

어쨌든, 여기 델파이 XE2에 대한 해결 방법입니다 :

{$APPTYPE CONSOLE} 
type 
    IStorageObject = interface(IInterface) 
    end; 
    TObjectStorage<T: IStorageObject> = class(TObject) 
    end; 
    IKeyStorageObject<TKey> = interface(IStorageObject) 
    end; 
    TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>, IStorageObject> = class(TObjectStorage<T>) 
    end; 
    TImplementingClass<TKey> = class(TInterfacedObject, IStorageObject, IKeyStorageObject<TKey>) 
    end; 
begin 
    TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create; 
end. 

원래 대답은

컴파일러 오류를 전시 완전한 프로그램을 제공 더라면 더 좋았을 것

. 오류를 보려면 객체를 인스턴스화해야합니다.

하지만 문제가 재현 된 것 같습니다.

TKeyObjectStorage<TKey, T: IKeyStorageObject<TKey>> = ... 

TKeyT 모두 일반 제약 조건을 적용 그래서 문제는이 코드 있다고 믿습니다. 이제, 분명히 당신은 단지 제약 T에 적용 할 그래서 당신은 작성해야 :

{$APPTYPE CONSOLE} 
type 
    IStorageObject = interface(IInterface) 
    end; 
    TObjectStorage<T: IStorageObject> = class(TObject) 
    end; 
    IKeyStorageObject<TKey> = interface(IStorageObject) 
    end; 
    TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = class(TObjectStorage<T>) 
    end; 
    TImplementingClass<TKey> = class(TInterfacedObject, IKeyStorageObject<TKey>) 
    end; 
begin 
    TKeyObjectStorage<Integer, TImplementingClass<Integer>>.Create; 
end. 

이를 :

여기
TKeyObjectStorage<TKey; T: IKeyStorageObject<TKey>> = ... 

델파이 XE3의 변화 다음 컴파일 간단한 프로그램입니다 쉼표가 세미콜론으로 바뀌는 뉘앙스입니다. 중요한 구두점으로 프로그래밍하는 것은 결코 재미있는 일이 아닙니다. 즉, 공식 매개 변수 목록에서 쉼표와 세미콜론의 차이점에 익숙하므로 여기에 그려지는 동일한 구분을보기에는 너무 놀랄 일이 아닙니다. 당신은 그냥 완전히 질문을 바꿨나요

Multiple Type Parameters

When you specify constraints, you separate multiple type parameters by semicolons, as you do with a parameter list declaration:

type 
    TFoo<T: ISerializable; V: IComparable> 

Like parameter declarations, multiple type parameters can be grouped together in a comma list to bind to the same constraints:

type 
    TFoo<S, U: ISerializable> ... 

In the example above, S and U are both bound to the ISerializable constraint.

+1

Thx David, 코드를 편집하여 인스턴스화하지 않고 전체 유닛을 편집하고 오류가있는 프로젝트를 재생성합니다. 그리고 네가 옳았 어, 나는 논리적으로 실수로 인해 ->; 하지만 내가 처리하고있는 오류가 아니 었어. 당신의 노력을위한 Thx. – Hugie

+0

업데이트해도 오류가 발생하지 않습니다. 시도 해봐. 새 프로젝트로 시작하여 해당 단위를 추가 한 다음 컴파일하십시오. 맞춰봐, 컴파일 해. 내가 대답 할 때 말했듯이, 객체를 인스턴스화해야합니다. 나는 이것으로 조금 좌절감을 느낍니다. SSCCE를 만드는 방법을 배워야 우리 시간을 낭비하지 않아도됩니다. 나는 지금 점심을 먹을거야. 나는 그 질문이 내가 돌아올 때까지 해결되기를 바란다. –

+1

'[DCC Error] Project22.dpr (11) : E2514 타입 매개 변수 'T'는이 라인에서 인터페이스 'IStorageObject'를 지원해야합니다 :'TKeyObjectStorage < TKey; T : IKeyStorageObject > = class (TObjectStorage )' – Johan