2016-09-12 2 views
1

Ich wurde dies in einem Interview gefragt. Angenommen, ich habe eine DLL (oder eine Klasse) mit mehreren Methoden, die von 10 Clients verwendet wird. Jetzt muss einer der Clients eine Methode ändern und der Klasse eine neue Methode hinzufügen. Wie kann dies erreicht werden, ohne dass die anderen Clients auf die neue Methode zugreifen?Wie definiert man eine Methode nur für einen Client und schränkt den Zugriff auf andere Clients ein?

+1

Neue Version der Bibliothek? Weil * "eine Methode ändern" * autsch ist (wenn es eine Signatur ist). Andere Clients sollten weiterhin ältere Versionen verwenden. – Sinatr

+0

Es muss ohne die anderen Kunden sein, die irgendwelche Änderungen vornehmen müssen. – adityawho

+2

Geben Sie ihnen eine Client-spezifische Unterklasse, die eine Methode überschreibt und eine andere hinzufügt? Geben Sie eine clientspezifische/neue Version mit den Änderungen frei? Was sind die anderen Einschränkungen? – tolanj

Antwort

1

Es scheint, dass Sie shoud eine neue Klasse erstellen, die von der ursprünglichen Klasse abgeleitet ist und hat eine zusätzliche Funktionalität. Zum Beispiel:

public class OriginalClass 
{ 
    public int SomeOriginalMethod() { } 
} 

public class YourNewClass : OriginalClass 
{ 
    public int SomeNewMethod() { } 
} 

Es gibt zwei Vorteile dort. Ihr Client erhält neue Funktionen und andere Clients verwenden weiterhin Ihre ursprüngliche Klasse. Wenn Sie möchten Grenze Zugang zu neuen functioanlity können Sie neue Methoden wie internal in Ihrer ursprünglichen Klasse hinzufügen und InternalsVisibleTo Attribut einen Zugang zu schaffen, nur für Kunden Sie

wollen
0

könnten Sie bedingte Kompilierungen verwenden, so dass der Code gleich bleibt Ihnen nur einen Compiler-Flag verwenden, um es zu ändern, wie

#if CLIENTA 
/* client a code here */ 
#else 
/* the other version of the code for not client a */ 
#endif 
+0

Ich glaube nicht, dass dies das ist, was erwartet wurde ... Es muss etwas mit OOP-Konzepten zu tun haben – adityawho

0

Wenn ich die Frage richtig verstanden habe, Ihre Klasse Bedürfnisse eine neue Methode verfügbar machen und das Verhalten einer bestehenden Methode für einen Client ändern, aber nicht für die anderen.

Eine einfache Möglichkeit, das zu erreichen, wäre eine andere Version der Assembly zu versenden, die Ihre Klasse enthält. Wie von anderen vorgeschlagen, könnten Sie die bedingte Kompilierung verwenden oder einfach die erforderlichen Änderungen in einer Assembly mit unterschiedlichen Versionsnummern implementieren. In diesem Szenario verwenden Ihre anderen weniger anspruchsvollen Clients die alte Version der Assembly, die diese Änderungen nicht enthält.

Natürlich müssen Sie möglicherweise die gleiche Version Ihrer Baugruppe/Klasse an alle Ihre Kunden versenden. In diesem Fall können Sie das Problem beispielsweise dadurch lösen, dass Ihre Klasse eine neue Schnittstelle, die nur von Ihrem anspruchsvollen Client verwendet wird, explizit implementiert. Ihr Code würde wie folgt aussehen:

// encapsulates changes requested by the client 
public interface INew 
{ 
    void DoNewStuff(); 
    int Foo(); 
} 

public class ExistingClass : INew 
{ 
    public int Foo() { /*the old implementation of Foo()*/ } 

    // Changes go here: 
    void INew.DoNewStuff() { /*implementation of the new method*/ } 
    int INew.Foo() {/*the new implementation of Foo()*/} 
} 

Hier wird das Verfahren DoNewStuff() und die neue Implementierung eines bestehenden Verfahren Foo() dem Anrufer nicht sichtbar sein würde, es sei denn, sie zuerst Ihre Klasse auf die INew-Schnittstelle umgewandelt, wie dies : Dieser Ansatz hat zwei potenziell erhebliche Nachteile, aber

ExistingClass ex = new ExistingClass(); 
INew n = ex as INew; 
n.DoNewStuff(); 
n.Foo(); // calls the new implementation of Foo() 

: 1) Sie würden die Klienten in der Annahme die neue Art und Weise Ihrer Klasse zu verwenden, demonstriert haben zu zwingen, wie oben; 2) Es hindert Ihre anderen Kunden nicht daran, die neuen Methoden zu verwenden (aber es stört Sie zumindest nicht, wenn Sie Ihre Klasse auf die alte Art benutzen). In der Frage, ob diese beiden wirklich wichtig sind, ist es ein wenig unklar, so dass diese Herangehensweise möglicherweise das ist, wonach die Interviewer gefragt haben.

+0

Wie ist das besser als eine neue Klasse abzuleiten und den anspruchsvollen Klienten zu bitten, sein Objekt zu erstellen, wie in Sergey's Antwort vorgeschlagen? – adityawho

+1

@ stylojack_10 Es könnte besser oder schlechter sein, abhängig von den tatsächlichen Umständen. Ein Grund, warum Sie diesen Ansatz bevorzugen könnten, ist, wenn Sie Ihre Klasse "versiegelt" behalten möchten, um zu verbieten, dass Clients von ihr erben, und so das spröde Basisklassenproblem verhindert. – Voidy

Verwandte Themen