2009-11-16 4 views
0

Un couple d'amis discutait l'utilisation de l'héritage et comment vérifier si une sous-classe est d'un type spécifique et nous avons décidé de le publier ici sur la pile. Le débat portait sur le fait de savoir si vous devez implémenter une énumération abstraite dans la classe de base pour vérifier le type de la sous-classe ou si vous devez utiliser l'opérateur is.chèque sous-catégorie, est chèque opérateur ou ENUM

Alt 1.

public abstract class Document{ 
} 
public class PDF:Document{ 
} 

Check: If (myobj is PDF) 

Alt 2.

public abstract class Document{ 
    public abstract DucumentType TypeOfDocument {get;} 
} 
public class PDF:Document{ 
    public DucumentType TypeOfDocument { get{return DucumentType.PDF };} 
} 
public enum DucumentType{ 
    PDF, Word 
} 

Check: If (myobj.TypeOfDocument == DucumentType.PDF) 

ceux pour Alt1. ment que Alt2 brise légèrement la SRP, vous ne profitez pas de OO, votre répétition de l'abstraction. Puisque l'héritage est la connexion la plus difficile entre les classes, vous ne pouvez pas éviter de les connaître, et si vous devez passer par l'héritage, minimisez l'impact. Alt2 brise aussi SECS

Ceux pour alt2 MENT que alt2 enlèvera le type de vérification entièrement et le remplacer par la possibilité de vérifier cette ENUM à la place. Suppression de toutes les connexions à toutes les sous-classes, et la valeur de l'énumération elle-même ne dit rien sur la mise en œuvre concrète qui est en cours d'exécution.

Quelle est votre opinion sur les deux alternatives?

Aucune discussion sur l'héritage par rapport à la composition, etc., c'est une autre question!

Répondre

3

Pourquoi avez-vous besoin de savoir en premier lieu? Je suis d'accord que c'est parfois nécessaire, mais lorsque cela est possible, vous devriez faire en sorte que le type de document ait une fonctionnalité abstraite appropriée pour permettre la spécialisation par héritage plutôt que l'appelant ayant à traiter différemment.

Je voudrais seulement utiliser l'approche ENUM si différentes sous-classes peuvent partager des types de documents, mais withotu voulant partager une hiérarchie d'héritage. Ce serait plutôt rare, IME.

0

IMO vous devez utiliser l'opérateur is. Il vous donne le même résultat sans altérer le code de classe (abstrait).

0

J'ai une situation similaire, sauf que dans mon cas, l'ENUM DocumentType a besoin de se développer en différents types sont ajoutés. En utilisant Enum, la vérification de type est bien meilleure, mais elle nécessite que la classe de base "générique" soit recompilée chaque fois qu'un nouveau DocumentType est ajouté.

L'alternative que je suis actuellement méditée est d'utiliser une propriété d'interface pour renvoyer le type en tant que chaîne. Ce n'est pas génial pour la vérification de type, mais le reste de mon code a la validation nécessaire pour empêcher les objets DocumentType escrocs. Je préférerais une solution différente, mais rien ne me vient à l'esprit.