PRIMA:
Ho un'interfaccia che ha una definizione di metodo
public interface IDockable
{
void Dock(DockerContainerConfig config);
}
Tutto è ok per la mia prima implementazione
public class DockerContainer : IDockable
{
public void Dock(DockerContainerConfig config)
{
}
}
public class DockerContainerConfig
{
//machine configuration properties here
}
Nella mia seconda implementazione, tuttavia, mi sono reso conto che ho bisogno di utilizzare un diverso set di configurazione.
public class DockerMachine : IDockable
{
public void Dock(DockerMachineConfig config)
{
}
}
public class DockerMachineConfig
{
//machine configuration properties here
}
DOPO:
Per rendere il Configuration Classes
polimorfico, ho creato una classe genitore e lasciato ereditare Configuration Classes
da esso.
public class DockerConfig
{
}
public class DockerMachineConfig : DockerConfig
{
//machine configuration properties here
}
public class DockerContainerConfig : DockerConfig
{
//container configuration properties here
}
Con questo ho anche cambiato la definizione del metodo per l'interfaccia.
public interface IDockable
{
void Dock(DockerConfig config);
}
E nelle mie lezioni concrete, ho appena fatto un cast sugli oggetti della classe di configurazione. Si prega di notare che le due classi di configurazione sono totalmente diverse, nulla è comune. Uno si occupa della macchina, quindi ha bisogno della configurazione della macchina e l'altra si occupa del contenitore, quindi ha bisogno della configurazione del contenitore. Ma in ogni caso lo fai, DockerContainer
e DockerMachine
fa la stessa cosa. "aggancia un container all'interno di una macchina" . È qualcosa come DockerMachine
fa cose dall'esterno e DockerContainer
fa le cose dall'interno. Hai un'idea:)
public class DockerContainer : IDockable
{
public void Dock(DockerConfig config)
{
DockerContainerConfig container = config as DockerContainerConfig;
}
}
public class DockerMachine : IDockable
{
public void Dock(DockerConfig config)
{
DockerMachineConfig machine = config as DockerMachineConfig;
}
}
Ci sono due cose che penso di aver fatto un errore qui:
- Ho modificato la definizione del metodo nell'interfaccia da
void Dock(DockerContainerConfig config);
avoid Dock(DockerConfig config);
- Ho creato una classe genitore vuota
public class DockerConfig{}
solo per poter rendere il mioConfiguration Classes
polimorfico
Vorrei sapere se le modifiche apportate sono conformi al buon design e alle migliori pratiche.