2009-01-19 6 views
0

J'ai une interface appelée ICommand à partir de laquelle différentes classes héritent. Ces classes font toutes différentes choses avec la méthode Run(), mais elles doivent toutes avoir une propriété Name et une propriété Description qui spécifie ce qu'elles font.Comment laisser la sous-classe spécifier des détails tels que le nom et la description

La question est de savoir comment laisser chaque sous-classe spécifier ces propriétés (Nom et Description). Au moment où j'ai mis une propriété pour les deux dans ICommand et j'obtiens chaque sous-classe pour implémenter ces propriétés et juste avoir une instruction return "Blah Blah Blah" en eux. Est-ce la meilleure façon de le faire? Ou devrait-il être fait d'une autre manière?

Désolé si cela semble être une question idiote - je ne fais que commencer avec ce truc de conception de POO et je veux vérifier que je le fais bien.

Répondre

1

Je pense que définir la propriété Readonly dans l'interface est la meilleure solution.

0

C'est typiquement l'approche que je prends. Je trouve qu'exiger des sous-classes de surcharger une propriété virtuelle ou une méthode pour renvoyer un identifiant descriptif est assez facile et rapide. J'imagine que vous pourriez faire quelque chose de similaire en utilisant la réflexion, mais vous allez certainement prendre un coup de performance.

0

On dit que les classes implémentent une interface, n'en héritent pas car l'interface n'a pas d'implémentation (et donc rien à hériter). Vous pouvez certainement faire ce que vous faites, et si les propriétés Nom et Description sont uniques à tout votre type, vous finirez avec plusieurs implémentations. Rien de mal avec ça si je vous comprends bien.

1

J'ai écrit quelque chose de similaire (plugins) où chaque classe a un autre nom et une description et a fini par la mise en œuvre comme le dit Sebastian, avec une propriété ReadOnly

interface ICommand { 
string Name { get; } 
string Description { get; } 
... 

classSpecific : ICommand { 
public string Name { get { return "Specific"; }} 
public string Description { get { return "Specific description"; }} 
... 
0

Vous êtes sur la bonne voie. Ce que vous décrivez est similaire au Strategy Pattern où vous avez plusieurs classes qui implémentent une interface (soit une interface réelle soit une classe abstraite) puis ont leurs propres implémentations pour les méthodes.

0

Si la propriété Nom et Description est différente pour chaque classe d'implémentation, alors faites ce que vous faites. Forcez chaque classe à implémenter ces propriétés (via votre interface) et laissez-les fournir les détails. Si toutefois, le nom et la description peuvent être identiques pour beaucoup de classes (bien qu'avec le nom et la description cela n'arrivera probablement pas) alors votre autre alternative serait une classe abstraite où Run() est une méthode abstraite, et Name et Description sont des propriétés virtuelles.

Questions connexes