2016-06-22 10 views
2

Ich habe Klassen mit Methoden mit den gleichen Namen, die das gleiche tun, aber sie sind anders implementiert.Wie reformiere ich zwei Klassen mit ähnlicher Funktionalität?

Ex:

class converterA { 
    map(Item1 item1) { 
     // Implementation details. 
    } 

    convert(Item1 item1) { 
     // Implementation details. 
    } 

    translate(Item1 item1) { 
     // Implementation details. 
    } 
} 

class converterB { 
    map(Item2 item2) { 
    // Implementation details. 
    } 

    convert(Item2 item2) { 
    // Implementation details. 
    } 

    translate(Item2 item2) { 
    // Implementation details. 
    } 
} 

ich als eine Schnittstelle verwenden, aber das Problem ist, das heißt, dass die Verfahren in verschiedenen Parametern übernehmen. Eine Vorlage passt aber auch nicht genau, da Item1 und Item2 unterschiedlich funktionieren. Mit anderen Worten, sie haben keine gemeinsamen Methoden, daher passt eine Vorlage auch nicht genau.

Gibt es hier eine Lösung zum Refactoring des Codes?

+1

Was möchten Sie in diesem Fall durch Refactoring erreichen? – dbugger

+1

Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, den Code zu verdichten oder eine Klasse im Interface-Stil zu haben, die erweitert werden kann, da die beiden Klassen eine ähnliche Funktionalität haben. – Interviewee

Antwort

0

Ich habe über die Verwendung der Template-Spezialisierung nachgedacht, aber wenn beide völlig unterschiedliche Methoden verwenden, lohnt es sich nicht wirklich, obwohl es besser lesbar wäre.

+0

Hmmm. Vielleicht sollte ich den Code so lassen wie er ist. – Interviewee

1

Ihr Kommentar gegeben „Art und Weise eine Schnittstelle gestylt Klasse ..., die erweitert werden können“, Sie Vorlagen in Verwendung interessiert sein könnten den gemeinsamen „Schnittstelle“ zum Ausdruck bringen:

template <typename Item> 
struct Converter 
{ 
    virtual void map(Item) = 0; 
    virtual void convert(Item) = 0; 
    virtual void translate(Item) = 0; 
}; 

class converterA : public Converter<Item1> { 
    void map(Item1 item1) final { ... } 
    void convert(Item1 item) final { ... } 
    void translate(Item1 item) final { ... } 
}; 
class converterB : public Converter<Item2> { 
    ...same kind of thing... 
}; 

Alles, was es kauft man obwohl ein Ausdruck der "Konverter" -Schnittstelle ist, die sie teilen, eine Kompilierzeit-Erzwingung, dass die Funktionssignaturen und -namen übereinstimmen (zB wenn Sie Converter<> ändern, werden Sie daran erinnert, alle abgeleiteten Typen zu aktualisieren), und die Fähigkeit zu handhaben die abgeleiteten Klassen verwenden Zeiger/Verweise auf die Template-Instanziierungen, von denen sie abgeleitet sind (die für Sie scheinbar nicht von Nutzen sind).