델파이에서 상속받은 형을 인자로 객체 생성할 땐 제너릭 대신 메타클래스로

만약에 어떤 형이 있고 상속받은 형이 있을 때, 상속받은 형을 인수로 넣어서 생성하려 한다면 처음 생각나는 건 제너릭일 것이다.

대략 식으로 선언을 하게 되면 T.Create를 부를 수가 있다.
그런데 여기에는 문제가 있는게, T.Create가 기본형이면 몰라도 T.Create에 어떤 인수가 들어가면 문제가 생긴다는 점이다.

그럴 때는 메타클래스를 쓰면 좋다.

메타클래스의 기본적인 사항에 대해서는 이 링크를 참고하자.

예를 들어서 TCar에 상속되는 TTruck, TBus가 있고, 생성자에 마력을 입력받아 각각에 대해서 생성을 하고 싶다면 다음과 같이 하면 된다.

TMetaCar = class of TCar;

function CreateCar(TCarToCreate: TMetaCar; Horsepower: Integer): TCar;
begin
  result := TCarToCreate.Create(Horsepower);
end;

이렇게 한 뒤 생성할 곳에서

var
  Bus: TCar;
  Truck: TCar;
begin
  Bus := CreateCar(TBus, 300);
  Truck := CreateCar(TTruck, 250);
end;

이런 식으로 사용하면 된다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.