J'ai un système avec lequel je me bats depuis un moment. Essentiellement, il utilise beaucoup d'abstraction pour faire face au fait que l'extension ultérieure n'est pas seulement attendue, mais nécessaire. Un endroit où cela est requis est l'accès aux données. Le système traite généralement de la gestion d'objets encapsulant une observation (au sens d'une valeur observée ou d'un ensemble de valeurs) et de les utiliser. A cette fin, j'ai quelque chose à l'effet de:L'interface expose le type A, mais l'implémentation nécessite le type B (sous-classe de A)
public interface Observation
{
/** UniqueKey is used to access/identify an observation */
UniqueKey Key
{
get;
}
}
public interface ObservationDataSource
{
/**
* Retrieves an Observation from the actual data source.
* performs any necessary operations to encapsulate values in object
*/
Observation GetObservationByUniqueKey(UniqueKey key);
}
Le problème se pose pour des implémentations spécifiques de ces interfaces. Finalement, les classes Observation
et ObservationDataSource
sont implémentées avec des classes d'exécution spécifiques. Cependant, UniqueKey
peut également être étendu pour traiter n'importe quel ensemble de valeurs d'identification unique pour une observation dans la source de données (peut-être un identifiant, peut-être une heure, etc.). Ainsi, toute implémentation de GetObservationByUniqueKey
exposera un argument UniqueKey
, mais attend une sous-classe spécifique. Je pense que le UniqueKey
sera casté à un type spécifique une fois passé.
Cela semble être un mauvais choix de conception, puisque l'implémentation repose sur les exigences de l'argument - mais je ne vois pas d'autre moyen de le faire. Je m'attends à ce que d'autres personnes utilisent ces interfaces, donc je ne peux pas dire que je me souviendrai de cette convention.
Des idées pour le réparer ou le manipuler plus élégamment?
J'adore l'icône beartato! =) –
haha, merci! J'aime ce petit homme. –