Ändern der Eigenschaft Typ in der Klasse implementiert das interface, mit dem Objekt-Typ Eigenschaft
Schreibe ich eine TemplateEngine, die mir erlauben, meine eigenen markup in text-basierten Dateien. Ich bin zu wollen fügen Sie Steuerelemente wie plugins wie die Anwendung reift. Ich habe aktuell eine Struktur wie die folgende:
interface IControl
string Id
object Value
class Label : IControl
string Id
string Value
class Repeater : IControl
string Id
List<IControl> Value
Nun sehen Sie das seltsame Teil sofort in die Repeater-Klasse mit der Value-Eigenschaft. Ich hatte gehofft, dass mit dem Wert geben Sie als Objekt in die Schnittstelle würde mir erlauben, die Flexibilität zu erweitern, die Kontrollen, als ich entlang gehen. Der compiler hat das nicht gerne, und das aus gutem Grund, denke ich.
Bottom line: ich bin zu versuchen, um alle control-Klassen implementieren das gleiche interface haben, aber unterschiedliche Typen für die Value-Eigenschaft.
Hat jemand irgendwelche Vorschläge, wie dies zu erreichen?
Hinweis: Bitte gehen Sie nicht in die darauf hindeutet, Dinge, die wie verwenden, Spark View Engine für templates. Es gibt einen Grund, warum ich bin, was zusätzliche Arbeit für mich.
- Was Fragen Sie?
- LOL Sorry, ich könnte brauchen, um eine video-clip erklärt es ein wenig besser. versuchen, zu mehr details führen könnten, in einem Roman
- Ich bin versuchen, um alle control-Klassen implementieren das gleiche interface haben, aber unterschiedliche Typen für die Value-Eigenschaft.
- aktualisiert meine Antwort wieder mit einem neuen Beispiel :->
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise die
Repeater
umsetzen würden, etwas anderes, wie einIItemsControl
zum Beispiel.BEARBEITEN 1
(aus Gründen der Kürze entfernt)
EDIT 2
Ah okay, Sie können verwenden Sie immer explizite interface-Implementierung natürlich:
können Sie auch Generika:
Ich mag dieses besser als die explizite interface-Idee, wenn es nur einen return-Wert, der geändert werden muss. Aber ich denke, wenn Sie hatte mehrere Eigenschaften, die jeder zurückkehren würde, eine andere Art, würden Sie nicht haben wollen IControl. Zumindest würde ich Sie nicht. In diesem Fall würde ich empfehlen, die expliziten Schnittstellen.
Natürlich, dies würde nicht funktionieren, wenn Sie nicht über Zugriff auf den Quellcode des IControl.
Edit: hatte einen Tippfehler. Feste
Nein, der compiler nicht erlauben, denselben Namen Felder verschiedene Datentypen anders als das, was in der Schnittstelle definiert in abgeleiteten Klassen.
Den Eigenschaften (da keine Felder sind erlaubt im interface) sollte durchgeführt werden, in der Ableitung von Klassen und Sie müssen denselben Datentyp haben. So, können Sie wahrscheinlich tun es mit Eigenschaften ohne explizite Deklaration.
Allerdings, wenn Sie machen, Wert von einer Funktion zurückgegeben wird, dann funktioniert es, aber Sie müssen überprüfen Sie die zurück geben weil die return-Typen sollten passen für die Funktion, sonst erhalten Sie eine Fehlermeldung, dass die Schnittstelle die Funktion wurde nicht implementiert.
[Update]
Sie müssen vorsichtig sein, wenn ausdrücklich die Definition der Körper, der Eigenschaften. Nachdem ein name für zwei Eigenschaften wäre gefährlich, wenn die Implementierung nicht sorgfältig durchgeführt.
Diese beiden Eigenschaften, wenn die verschiedene definition, wäre es erklärbar, die für die endgültige Verwendung des interface-und Klassen.
Diesem Beispiel sehen:
Können Sie beobachten, dass in der Liste container-Repeater haben unterschiedliche Werte, wenn Daten Hinzugefügt, die über IControl (wegen der expliziten definition der IContainer.Wert).