? Tengo un problema de diseño que no puedo entender. Esto es lo que tengo:¿Puedo combinar composición y herencia con interfaces en C#
En general, tengo dos tipos generales de objetos Huelgas y opciones. Estos han sido resumidos en dos interfaces IStrike y IOption.
Digamos que IOption tiene los siguientes campos, en realidad hay alrededor de 10 veces más, pero podemos usar los siguientes tres para ilustrar el problema.
interface IOption
{
double Bid{get;set;}
double Ask{get;set;}
double ImpliedVol{get;set;}
}
interface IStrike
{
IOption Call{get;set;}
IOption Put{get;set;}
}
Ahora, eso es todo muy bien, pero digamos que tengo el siguiente método para realizar un poco de "matemáticas" en el vol iOption implícita
public double SquareImpliedVol(IOption opt)
{
return Math.Pow(opt.ImpliedVol,2);
}
Una vez más, no es un problema, pero cuando estoy escribiendo algunos objetos simulados para mis pruebas, no tengo claro si necesito implementar Bid and Ask. No, pero no lo sabría a menos que conociera las agallas dentro de SquareImpliedVol, lo que significa que estoy escribiendo pruebas contra el código, lo cual es malo.
Así que para solucionar este problema, podría crear otro IOptionImpliedVol interfaz que solo contiene la propiedad ImpliedVol, y luego tiene iOption hereda de IOptionImpliedVol al igual que
interface IOption : IOptionImpliedVol
{
double Bid{get;set;}
double Ask{get;set;}
}
y luego podemos cambiar hasta SquareImpliedVol
public double SquareImpliedVol(IOptionImpliedVol opt)
{
return Math.Pow(opt.ImpliedVol,2);
}
Y estamos geniales. Puedo escribir objetos simulados y todo es dulce. Excepto .... Quiero escribir un método que operará en una lista, pero las únicas propiedades que necesito de IStrike son Call.ImpliedVol y Put.ImpliedVol. Quiero crear algo así como
interface IStrikeImpliedVol
{
IOptionImpliedVol Call;
IOptionImpliedVol Put;
}
y luego yo también podría tener
interface IStrike : IStrikeImpliedVol
{
IOption Call;
IOption Put;
}
Excepto que no es legal. Siento que tiene que haber algún tipo de patrón de diseño para resolver esto, pero estoy atrapado en una especie de red de composición y herencia.
1 a la idea de que el diseño inicial era correcta. Estoy bastante seguro de que * no * quiere ir con las interfaces de '' IOptionImpliedVol' y IStrikeImpliedVol'; ¿Cuando terminará? Yousef (Jonathan) ya dio un término muy apropiado para describir el camino que esto lleva a la derrota: una * web * desordenada y complicada. Escucha a Snowbear. –
Gracias. A veces puedo ser un poco pedante con el diseño, y es bueno tener una comunidad como StackOverflow hablar cuando pienso que podría estar sucediendo. –