Überschreiben Sie eine öffentliche Eigenschaft aus einer abgeleiteten Klasse
In einem alten Projekt verwenden wir eine Dritte Partei, die assembly mit einer Klasse, die eine Eigenschaft mit einigen hardcoded Informationen:
public string ConnectionString
{
get
{
string[] fullDbName = new string[5];
fullDbName[0] = "Data Source=";
fullDbName[1] = this.dbServer;
fullDbName[2] = ";Initial Catalog=";
fullDbName[3] = this.FullDbName;
fullDbName[4] = ";Integrated Security=SSPI;Pooling=false";
return string.Concat(fullDbName);
}
}
Ich muss in der Lage sein zu konstruieren, die den connection-string selbst. So habe ich versucht, eine abgeleitete Klasse, die blendet die original-Eigenschaft, aber es scheint nicht zu funktionieren:
public class SqlServerRestorerExstension : SQLServerRestorer
{
public SqlServerRestorerExstension(string dbServer, string dbName, string dbFilePath, string dbDataFileName, string dbLogFileName, bool detachOnFixtureTearDown, string connectionstring) : base(dbServer, dbName, dbFilePath, dbDataFileName, dbLogFileName, detachOnFixtureTearDown)
{
ConnectionString = connectionstring;
}
public string ConnectionString { get; private set; }
}
Ist es möglich, tun erreichen dies in keiner Weise, wenn ich nicht haben Zugang zu den third-party-code?
Tut SQLServerRestorer implementiert keine Schnittstelle, die den ConnectionString in es deklariert?
Nein, die ConnectionString-Eigenschaft deklariert wird, als öffentliche Eigenschaft der Klasse SQLServerRestorer.
Nein, die ConnectionString-Eigenschaft deklariert wird, als öffentliche Eigenschaft der Klasse SQLServerRestorer.
InformationsquelleAutor peterbf | 2012-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als andere haben darauf hingewiesen, können Sie die
new
keyword zu verstecken, die Basis-member-Eigenschaft. Beachten Sie jedoch, dass dies nicht magisch drehen Sie dieConnectionString
Eigenschaft in eine polymorphe Funktion, d.h. wenn Sie so etwas wie dieses:- und Sie tun dies:
Dann noch sehen Sie ein "a" auf der Konsole ausgegeben. In der Tat die
new
Stichwort nur Stoppt der compiler von der Erteilung einer Warnung in Bezug auf das ausblenden der member der Basisklasse. Es ändert nicht das Verhalten des Codes zur Laufzeit.Können Sie versuchen, verwenden Sie einen Dekorator-Muster und wickeln Sie die
SQLServerRestorer
, aber wenn das nicht funktioniert, sind Sie kein Glück, fürchte ich.Ich glaube nicht, dass das Dekorator-Muster wird helfen, weil die SQLServerRestorer-Klasse wird verwendet, um eine variable definieren, in der Dritten code - und damit die ursprüngliche Eigenschaft ConnectionString wird aplied.
Das ist es, was ich befürchtete, sonst den trick mit dem verstecken der Eigenschaft hätte wahrscheinlich auch funktioniert. Sie konnte Ihr Glück versuchen, mit ein aspektorientiertes framework wie PostSharp oder nachträglicher Einfall , können Sie ändern Sie die Eigenschaften einer vorhandenen Baugruppe durch MSIL-Injektion.
Vielen Dank für Ihren Vorschlag. Ich eigentlich am Ende schreiben meine eigene Umsetzung dessen, was der Dritten Komponente hat - es dauerte nur ein paar Stunden, so dass schien die einfachste Lösung.
InformationsquelleAutor afrischke
Müssen Sie angeben, dass Sie möchten, zu 'ersetzen' diese Eigenschaft, mit
new
:Natürlich können Sie erweitern, dass für die Umsetzung Ihrer eigenen
set
werden, wenn auch nur zu nutzen, auto-Accessoren implementiert. Dokumentation auf 'Versionsverwaltung' mitnew
finden hier, aber speziell:InformationsquelleAutor Grant Thomas
Du suchst die
new
Stichwort:InformationsquelleAutor Yuck
Du willst überschreiben die Methode, aber es scheint, Sie können nicht:
Obwohl andere darauf hinweisen, dass Sie verwenden können, die neue Modifikator, ich glaube nicht, dass wird Sie gut dienen:
Mir, das klingt wie jeder code, der mit der Basis (3rd party) geben wird, berufen sich auf die alte Eigenschaft - das ist eine Sauerei, die nur darauf warten zu passieren!
new
Modifizierer verwendet wird, in C#.Wirklich, der OP will
override
so wie es da steht.genau richtig, der OP will das ändern das Verhalten eines Objektes ist, daß er nicht die Quelle.
new
wird genau das tun. Er hat nicht versucht, kombiniertoverride
undnew
wie hier vorgeschlagen.Es ist schade, es gibt keinen Weg, um zu erklären, "überschreibt" - Mitglied und ein "neues" Mitglied mit dem gleichen Namen in der gleichen Klasse; eine derartige Möglichkeit würde es erlauben, einen nur-lese-Eigenschaft außer Kraft gesetzt werden mit einer neuen Umsetzung und auch überschattet von einem Lesen-schreiben, oder eine base-class-Funktion, die zurückgibt einen Basistyp, überschrieben wird mit einer abgeleiteten Klasse die Funktion zurückgibt, die einen abgeleiteten Typ. Um sicher zu sein, wenn andere Mittel gab es für solche Dinge tun, diejenigen, die vielleicht genauso gut, aber eine zusätzliche Ebene der Hierarchie, um Sie zu erreichen scheint hässlich.
vielleicht bin ich dem Verständnis etwas falsch hier, aber wenn du an dieses neue Objekt in eine Methode erwartet die Basisklasse, dann wird nicht die alte Eigenschaft abgerufen werden? Das ist
new
nicht polymorph? Das ist ein Problem...InformationsquelleAutor Daren Thomas