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?
Wie definiert man eine Methode nur für einen Client und schränkt den Zugriff auf andere Clients ein?
Antwort
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
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
Ich glaube nicht, dass dies das ist, was erwartet wurde ... Es muss etwas mit OOP-Konzepten zu tun haben – adityawho
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.
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
@ 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
- 1. Wie schränkt man eine Methode auf einen bestimmten Thread ein?
- 2. Wie schränkt man den Zugriff auf GAE Flexible Site nur für GSuite-Konto ein?
- 3. Wie schränkt man den PHP-Dateizugriff auf das Ausführungsverzeichnis ein?
- 4. Wie schränkt man ein Protokoll nur auf Werttypen ein?
- 5. Wie schränkt man TcpClient ein, um auf eine Verbindung oder einen Client für eine bestimmte Zeit zu warten, statt auf die Annahme von Clients zu warten?
- 6. Wie schränkt man Wiederholungsversuche ein?
- 7. PHP - Wie schränkt man eine API ein?
- 8. Wie schränkt man den Benutzer ein, um nur auf seine Gruppenelemente in Loopback zuzugreifen?
- 9. Wie man einen Dienstverweis auf ein WCF-Client für einen Web-Service erfordert Client-Authentifizierungszertifikat
- 10. Schränkt der Initial Catalog-Parameter in der Verbindungszeichenfolge den Zugriff auf andere Datenbanken ein?
- 11. Wie schränkt man den Jgit DiffFormatter auf Java-Datei ein?
- 12. Wie schränkt man eine Ansicht auf Superuser ein?
- 13. Wie man einen Server für LAN-Clients erkennbar macht
- 14. Wie schränkt man Einkäufe auf NUR IP-Adressen in den USA mit Ruby/Rails ein?
- 15. Wie schränkt man den Zugriff auf Routen im React-Router ein?
- 16. Wie schränkt man den Google Places-Webdienst nur auf Großbritannien ein?
- 17. Wie schränkt man Google Formular-Antworten auf angemeldete Benutzer ein?
- 18. Wie schränkt man den Bewegungspfad einer Ansicht/Ebene auf einen Bezier-Kurvenpfad ein?
- 19. Wie schränkt man Läufer auf einen bestimmten Zweig ein und sperrt das .gitlab-ci.yml vor Änderungen?
- 20. Wie schränkt man einen bestimmten Befehl in bash ein?
- 21. Wie schränkt man eine Lotusansicht auf den Inhalt einiger Ordner ein?
- 22. Machen Methode zugänglich nur für andere Klasse
- 23. SQL Server schränkt Benutzer nur auf ausgewählte gespeicherte Prozeduren ein
- 24. Wie kann Lightpd oder PHP eine andere Website für den Client laden und ausgeben?
- 25. Wie schränkt man Prolog-Fakten ein?
- 26. Wie schränkt man eine Telefonnummer in SQLite ein?
- 27. Wie definiert man einen systemweiten Alias für ein Python-Skript?
- 28. Wie schränkt man die Registrierung ein und erstellt eigene Anmeldedaten?
- 29. Warum schränkt Java den Zugriffsmodifizierer einer Ausblendmethode ein
- 30. Rufen Sie die Meteor-Methode nur auf dem Client auf
Neue Version der Bibliothek? Weil * "eine Methode ändern" * autsch ist (wenn es eine Signatur ist). Andere Clients sollten weiterhin ältere Versionen verwenden. – Sinatr
Es muss ohne die anderen Kunden sein, die irgendwelche Änderungen vornehmen müssen. – adityawho
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