2009-11-12 3 views
1

generic의 유형을 두 개의 다른 클래스로 제한 할 수 있습니까? 그래서 같이Delphi : generic and type constraints

:

(형식의 부족에 대해 죄송합니다 - SO 도구 모음이 브라우저에서 사라졌다)
TSomeClass<T: FirstClass; T: SecondClass> = class 
    // ... 
end; 

. 위의 내용은 컴파일되지 않는다는 것을 알고 있습니다. 나는

TSomeClass<T: FirstClass, SecondClass> = class 
    // ... 
end; 

을 시도하지만 난이도 가능

procedure TSomeClass.SomeMethod<T> (Param1: string); 

을 쓸 수 없습니다?

+0

소스 코드 서식을 얻기 위해 4 공백 들여 쓰기를 사용하십시오. 도구 모음이 필요하지 않습니다. – jpfollenius

답변

10

아니요, 불가능합니다. 컴파일러는 메서드 호출이 유효하다는 것을 정적으로 어떻게 확인할 수 있습니까?

주, 그

TSomeClass <T : FirstClass, SecondClass> 

는 유효한 유형의 제약 조건이 아닙니다. 여러 클래스 제약 조건을 결합 할 수는 없습니다. 클래스 제약과 인터페이스 제약을 조합 할 수 있습니다. TSomeClassISomeInterface을 구현에서하지만 그렇다하더라도

TSomeClass <T : TSomeClass, ISomeInterface> 

수단은 제네릭 형식이 가지고 내려합니다.

TSomeClass <T : IOnePointFive> 

아마 당신이에 대한 몇 가지 세부 사항을 제공 할 수 있습니다 :

그래서 당신이 할 수있는 유일한 방법은, FirstClassSecondClass 사이의 일반적인 물건을 추출하는 인터페이스에 넣어 및 인터페이스 제약 조건을 사용하는 것입니다 달성하고자하는 것.

+1

+1 인터페이스 이름 : – Tihauan

+0

감사합니다. Smasher. 필자에게 제네릭은 어쨌든 마법처럼 보입니다. 그래서 컴파일러가 잡을 수 있거나 잡을 수없는 것에 대한 직관이 없습니다 ...하지만 동일한 인터페이스를 구현하는 것은 수용 가능한 해결책입니다. 실제로 클래스 메서드를 대신 사용하여 문제를 해결했습니다. 클래스간에 차이가 나는 것은 클래스 간의 차이입니다. 클래스 메소드를 사용하면 클래스를 생성 할 필요가 없으므로 클래스를 구현할 수 있습니다. – conciliator

2

두 클래스 모두 동일한 인터페이스를 구현하는 것이 좋습니다. 그런 다음 해당 인터페이스에 제네릭을 제한하십시오.

+0

감사합니다. 나는 당신과 스 매셔의 대답을 모두 받아 들일 수 있었으면 좋겠지 만, 그가 처음 이래로 스 마셔의 것으로, 그리고 그의 직위의 세부 수준 때문에. 그러나 노력에 감사드립니다! – conciliator