Kannst du nicht einfach dein Socket erzeugen und anschließend über Methoden und Eigenschaften der Basisklasse darauf zugreifen? Setzt natürlich voraus, dass so gut wie alles, was mit den Sockets gemacht werden muss, sich nur in der Implementierung und nicht im Interface unterscheidet. Das Buzzword "Factory" kommt mir da in den Kopf. Wenn einer der Sockets zusätzliche Informationen benötigt, die die anderen nicht kennen, kannst du diese ja auch als Konstruktorparameter übergeben. Also grundsätzlich, wie auch immer du es genau machst, Pseudocode:
Delphi-Quellcode:
var socket: TCustomSocket;
socket := SocketFactory.CreateSocket(proxyType);
try
// ... tue alles mit socket, was für alle gemeinsam ist
finally
socket.Free;
end