2014-11-10 5 views
0

나는 기본 클래스 테스트델파이에서 일반 typecasting하는 방법?

type 
Tinfo = procedure of object; 

Test = class(TObject) 
public 
    procedure Add (const a : Tinfo); reintroduce ; 
end; 


procedure Test.Add(const a: Tinfo); 
begin 
    Writeln('base class add function'); 
    // dosomething more 
end; 

아래 정의하고 난이 기본 클래스

TTesting<T> = class(Test) 
    public 
    procedure Add (const a : T ); reintroduce ; 
    end; 

내가 Tinfo-T를 타입 캐스팅 오전 파생 제네릭 클래스를 가지고 있지만, 그것은 나에게 오류를 제공

procedure TTesting<T>.Add(const a : T); 
begin 
    inherited Add(Tinfo(a)); // gives me error here 
end; 

내가 구현할 수있는 방법이 있습니까?

+0

형식 식별자를 변환하려고합니다. 'a' ('a'의 타입)가 아니라'a' (변수)를 사용해야합니다. 하지만 이건 안전하지 않아! 그리고 어쨌든 코드가 작동하는지 확실하지 않습니다. 뭐하고 싶어? 어쩌면 다른/더 나은 접근 방법이있을 수 있습니다. – linluk

+1

이 질문에 여러 번 질문했습니다. 왜 우리에게 진짜 문제를 말하지 않니? –

+1

첫 번째 객체에서'Add '에'reintroduce'하는 이유는 무엇입니까? TObject에는 'Add'라는 가상 메소드가 없습니다. 그래서 추측을 해봅시다. 이것은 실제 코드가 아닙니다. 그리고 당신이하려는 것은 의미가 없습니다. 함수 포인터에 대한 집착은 무엇입니까? –

답변

1

는 먼저 캐스트가 잘못, 당신은 분명히 당신이 그것을 더하게 어떤 식 으로든 다형성 할 수없는 종류 인 객체의 절차에 캐스팅을 입력하려는 경우에는 a와하지 T.

캐스팅 할 이를 일반 유형으로 변환하는 의미.

T는 무엇이되어야합니까? 그것은 귀하의 코드에서 TInfo 일 수 있습니다.

그러나 T를 이벤트/메소드 유형으로 사용하려면 기본 클래스에 TMethod를 저장 한 다음 일반 클래스의 TMethod와 함께 사용해야합니다. 그러나 T를 이벤트 유형으로 제한하는 제약 조건을 가질 수 없다는 것을 기억하십시오. 그래서 생성자에서 확인할 수 있습니다.

type 
    PMethod = ^TMethod; 

    Test = class(TObject) 
    public 
    procedure Add(const a: TMethod); reintroduce ; 
    end; 

procedure Test.Add(const a: TMethod); 
begin 
    Writeln('base class add function'); 
    // dosomething more 
end; 

type 
    TTesting<T> = class(Test) 
    public 
    constructor Create; 
    procedure Add(const a: T); reintroduce ; 
    end; 

constructor TTesting<T>.Create; 
begin 
    Assert(PTypeInfo(TypeInfo(T)).Kind = tkMethod); 
    inherited Create; 
end; 

procedure TTesting<T>.Add(const a: T); 
begin 
    inherited Add(PMethod(@a)^); 
end; 
+0

T는 항상 객체의 유형 프로 시저이지만 정수, 문자열 또는 둘 다를 허용 할 수 있습니다. –

+0

'객체의 프로 시저 '는 아무 것도 받아 들일 수 없습니다. 매개 변수없는 메서드의 정의입니다. 며칠 전 다른 질문에서와 동일한 문제입니다. 제네릭으로는 쉽게 작동하지 않는 메소드 유형 (또는 호출 가능한 유형)을 이해해야합니다. –

+0

내가 받아 들일 때 그것은 타입 일 수 있다는 것을 의미한다. TInformationEvent1 = 객체의 프로 시저 (x : 정수); TInformationEvent2 = 개체의 프로 시저 (x : 정수, y : 문자열). TInformationEvent6 = 개체의 프로 시저 (x : boolen; y : 문자열). –