Was für eine tolle Seite das ist, ich habe hier lauernd gelesen andere Fragen seit Jahren, aber jetzt habe ich eine eigene.Unter Verwendung von Generics wird es als Button deklariert, wird aber als internes Steuerelement für die Klasse behandelt. Warum?
Mein Kollege schrieb eine Klasse wie die untenstehende. Sobald ich es sah, wusste ich, dass es nicht funktionieren würde, aber ich habe keine Erklärung für ihn, warum es nicht funktioniert.
Was er erwartet, wenn er es als ControlItem<Button>
deklariert, ist, dass die Draw (Button) -Methode aufgerufen werden würde, wenn die Base verwendet wird, um Draw() aufzurufen. Stattdessen enden wir immer damit, die Ausnahme zu werfen.
Ist dies ein Kovarianzproblem? Diese
public abstract class ControlItem
{
public ControlItem()
{
}
abstract public void Draw();
}
public class ControlItem<T> : ControlItem where T : Control, new()
{
public T MyControl { get; set; }
private ControlItem()
{ }
public ControlItem(T control)
: base()
{
MyControl = control;
}
public override void Draw()
{
Draw(this.MyControl);
}
public void Draw(Control cntrl)
{
throw new NotImplementedException();
}
public void Draw(Button button)
{
//Do some work
}
}
OK Ich sehe Ihren Punkt und Mann diese Antworten kamen schnell. Allerdings, um Ihren Punkt zu folgen, ist es nicht das gleiche wie Ihr Beispiel. In Ihrem Fall zur Kompilierzeit ist c als Base deklariert, aber in meiner zur Kompilierzeit T ist Button, so dass es als Button MyButton deklariert ist. Wie Ihr Abgeleitetes b. –
Das stimmt, aber zum Zeitpunkt der Kompilierung ist alles, was es weiß, die Einschränkung: T ist ein Control, also bindet es an die Methode, die ein Control braucht. Dies unterscheidet sich von C++ - Vorlagen, die vor der Kompilierung instanziiert werden. – munificent
@munificent: +1 Sehr gut erklärt. Hat mir auch geholfen. Vielen Dank! – Codex