Sé que el título es muy amplio, abarcando mucho.Genéricos, polimorfismo, interfaces: ¿cuál es la solución?
Y espero que esta pregunta pueda evolucionar a una mayor "información wiki thingy" sobre los temas.
Lo que he aprendido - hasta ahora:
- Al utilizar los genéricos - Comprender los conceptos (covariance and contravariance).
- Do NOT "mis-use" el concepto de genéricos combinado con la herencia. ¡Lo hice y podría hacerte enfrentar directamente los problemas de covarianza! Asegúrese de "interrumpir" el genérico en el punto correcto de su herencia, si está combinando los dos.
(corríjame si crees que me equivoco, me falta algo o no he entendido nada).
Mi problema era:
Pero por ahora he pasar horas y horas, tratando de averiguar, cómo resolver este "gran rompecabezas" Tengo en mi escritorio. Y ya obtuve algunas buenas respuestas de varios de ustedes usuarios de SO, pero ahora es el momento de obtener algo que funcione en una escala mayor.
me aventuré en los genéricos con éste: Generics and Polymorphism working together
y ahora estoy un poco atascado en este caso: Situations where Generics won't work
Por qué termino con problemas de covarianza - es debido a mi clase de procedimiento mi jerarquía
Así que me pregunto si Interfaces es mi próximo movimiento audaz en esta "saga". ¿Cómo se puede "pasar" por un problema de covarianza? Una cosa es descubrir que realmente tiene este problema; otra cosa es "cómo solucionarlo".
Así que si cualquiera de ustedes, buena gente, "por ahí" tiene alguna opinión sobre esto, soy todo oídos. Básicamente: Dime que vaya por Interfaces (nunca he hecho uno desde cero). O .. arrojame un hueso en la dirección que sugieras.
Mi grupo de fuentes actual es como se indica en el segundo enlace, desde la parte superior.
Aquí hay un pequeño fragmento de mi anterior post que muestra mi problema de covarianza. David amablemente explicado - ¿Por qué me topé con el arbusto ... pero ahora necesito información sobre cómo manejarlo?
var
aList : TBaseList<TBaseObject>; // used as a list parameter for methods
aPersonList : TPersonList<TPerson>;
aCustomerList : TCustomerList<TCustomer>;
begin
aPersonList := TPersonList<TPerson>.Create;
aCustomerList := TCustomerList<TCustomer>.Create;
aList := aCustomerList; <-- this FAILS !! types not equal ..
end;
Saludos
Ayudaría si realmente supiéramos cuál es su problema real. En mi experiencia, la covarianza rara vez es un problema, si el diseño no es demasiado complejo. IOW, cuéntanos el problema real, entonces tenemos algo concreto que resolver. –
@RudyVelthuis Bueno ... como usted menciona, es muy complejo y requeriría mucha reescritura del anterior [post] (http://stackoverflow.com/q/9140485/696574). Pero básicamente es el mismo problema: solo la pregunta ha cambiado. Como ahora sé lo que hice mal, simplemente espero que alguien me pueda orientar en la búsqueda de una solución. Si aún no está claro, házmelo saber y lo intentaré y explicaré lo mejor que pueda. –
Cómo solucionar el problema depende de cuál es el problema * *. Una vez que asigna un valor a 'aList', ¿qué esperaba * hacer * con esa variable? (Además, ¿por qué son genéricos TPersonList y TCustomerList? ¿Qué * else * puede tener una TPersonList de?) –