2017-06-15 4 views
1

Immer noch ein wenig frisch zu C#, ich habe eine "Dienstprogramm" -Klasse, die ich über mehrere interne Projekte hinweg verwenden möchte. In einem Projekt gibt es ein großes (hunderte von Eigenschaften, nicht mein Tun ...) internes Objekt (SpecialObj). Die anderen Projekte haben keinen Zugriff auf dieses Objekt, und das Hinzufügen zu ihnen ist ein Nicht-Starter, so dass die Basismethode SpecialObj nicht kennt.C# Erweiterung mit fast identischen Methoden

Also hier ist der Haken: MyMethod in MyClass (nimmt dieses spezielle Objekt nicht) und MyClassExtension (nimmt das spezielle Objekt) haben fast identische Code, mit Ausnahme für einen Teil in der Mitte, die dieses spezielle Objekt verwendet.

public class MyClass{ 
    public string MyMethod (string param1, Dictionary<string, string> param2){ 
     //some code in here part 1 
     //some code in here part 2 
    } 
} 

public class MyClassExtension : MyClass{ 
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3) 
    { 
     //some code in here part 1 
     //something with param3, my special object 
     //some code in here part 2 
    } 
} 

Aufrechterhaltung von 90% identischem Code in zwei Methoden scheint ... sehr falsch. Gibt es Beispiele oder Standards für diese Situation?

+7

Könnten Sie hier Teil 1 'einige Code nicht erhalten 'und' einige Code in hier Teil 2 'in zwei anderen Methoden? –

+0

Kann 'MyClass :: MyMethod' durch' MyClassExtension :: MyMethod' aufrufen? – Igor

+0

@DanDumitru das ist ein wirklich, wirklich guter Gedanke ... vielleicht werde ich das versuchen. –

Antwort

2

Sie können den Code in geschützte Teile geteilt und nennen sie

public class MyClass 
{ 
    public string MyMethod (string param1, Dictionary<string, string> param2) 
    { 
     ProtectedMyMethodPart1(...); 
     ProtectedMyMethodPart2(...); 
    } 

    protected void ProtectedMyMethodPart1(...) 
    { 
    } 

    protected void ProtectedMyMethodPart2(...) 
    { 
    } 
} 

und Wiederverwendung der Ressourcen in der vererbten Klasse

public class MyClassExtension : MyClass 
{ 
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3) 
    { 
     ProtectedMyMethodPart1(...); 
     // Do something with param3 
     ProtectedMyMethodPart2(...); 
    } 
} 
0

Wahrscheinlich werde ich so etwas tun.

public class MyClass{ 
    public virtual string MyMethod (string param1, Dictionary<string, string> param2){ 
     int i= MyCommonCode.MyCommonMethod(); 
     //I do whatever I like with i here 
    } 
} 

public class MyClassExtension : MyClass{ 
    public string MyMethod (string param1, Dictionary<string, string> param2, SpecialOjb param3) 
    { 
     int i= MyCommonCode.MyCommonMethod(); 
     //I do whatever I like with i here 
    } 
} 

public class MyCommonCode 
{ 
    public static int MyCommonMethod() 
    { 
    return 1; 
    } 
} 
Verwandte Themen