만약에 어떤 형이 있고 상속받은 형이 있을 때, 상속받은 형을 인수로 넣어서 생성하려 한다면 처음 생각나는 건 제너릭일 것이다.
대략
그런데 여기에는 문제가 있는게, 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;
이런 식으로 사용하면 된다.