2009-07-24 4 views
1

Dans mon projet, j'ai quelques fonctions dans les classes dérivées qui sont identiques, à l'exception d'une section qui est différente dans chaque classe.Refactorisation des méthodes dérivées des classes dérivées à la méthode de la classe de base commune? (C#)

Je veux tirer la méthode jusqu'à la classe de base.

Les fonctions se présentent comme suit:

func(parameters) 
{ 
//COMMON BITS 

if  (someVar == "value1") { htmlFilename = line; } 
else if (someVar == "value2") { subVideoLink = line; } 
else if (someVar == "value3") { linksH2HeadingWritten = true; } 

//COMMON BITS 
} 

où les lignes centrales des différentes fonctions ressemblent toutes ci-dessus mais ont des valeurs différentes pour « someVar » et différentes variables dans la « variable = ligne; » format.

C'est la forme généralisée:

if (someVar == "CommandName") { variable = line; } 

L'idée que j'avais été d'envoyer la fonction d'un Dictionary<string CommandName, ref string> ... mais il semble que je ne peux pas faire un dictionnaire avec chaîne ref en elle ...

Je supprimerais alors les cas booléens de la 'variable' en les remplaçant par des versions de chaîne avec des valeurs de "vrai" ou "faux".

Y a-t-il une meilleure façon de procéder?

Répondre

4

Une meilleure approche consisterait à définir une méthode virtual (ou abstract) dans la classe de base que vous appelez func. Ensuite, dans chacune de vos sous-classes, vous pouvez remplacer la méthode par les instructions spécifiques et func utilisera le comportement de la sous-classe.

public class MyBase 
{ 
    protected virtual void DoCommand() { throw new NotImplementedException(); } 

    public void Func() 
    { 
     ... 
     DoCommand(); 
     ... 
    } 
} 

public class MySubClass : MyBase 
{ 
    protected override void DoCommand() 
    { 
     ... 
    } 
} 
+0

Ahhh ... Je vois ce que vous dites. Merci, je vais essayer ça. –

+0

Au lieu de jeter dans la base, pourquoi ne pas le marquer abstrait? –

+0

Les méthodes abstraites nécessitent une classe de base abstraite. Si la classe de base doit être concrète pour une raison quelconque, il s'agit d'une implémentation par défaut possible. Vide serait un autre choix. Faites votre choix. :) – dahlbyk

0

Vous devez créer une méthode Overridable sur la classe de base:

abstract func(parameters); 

et la mettre en œuvre sur les classes dérivées:

class CommandN { 
... 
func(parameters) 
{ htmlfilename = line; } 
} 

class CommandSubVideoLinkX { 
... 
func(parameters) 
{ subVideoLink = line; } 
} 

Et ainsi de suite.

+0

Les classes de commandes ne sont pas les classes dérivées dans lesquelles ces fonctions sont ... Désolé, je n'ai pas précisé cela. –

0

Si je comprends ce que vous essayez de faire correctement, vous pouvez réduire

if (activeCommand.GetType().Name == "CommandName") { variable = line; } 

Down to:

if (activeCommand is CommandType) { /*logic, cast if necessary*/ } 

Très utile lorsque vous avez une fonction qui prend une classe de base, mais effectue un cas particulier pour un type dérivé. Cela gèrerait également les cas où un autre type dérive de CommandType.

+0

ouais, merci, j'ai eu un pet de cerveau momentanée –