Abstrakte Methode, die eine Instanz einer abgeleiteten Klasse zurückgibt

7

Ist es möglich, eine abstrakte Methode zu erstellen, die eine Instanz der abgeleiteten Klasse zurückgeben muss? Ich kann das tun:

%Vor%

Aber ich habe mich gefragt, ob es einen Weg dafür gibt, dass Derived::GetObj() gezwungen ist, ein Derived zurückzugeben?

Danke.

    
Eric 20.02.2012, 12:49
quelle

2 Antworten

16

Die Verwendung von Generika sollte dies ermöglichen:

%Vor%

Sie könnten sogar noch mehr vereinfachen (wenn alle abgeleiteten Instanzen mit Standardkonstruktoren erstellt werden):

%Vor%     
Lukazoid 20.02.2012, 12:51
quelle
6

Was Sie haben, ist fast, aber nicht genau eine abstrakte Fabrik. Ich werde zuerst sagen, dass Sie es den Implementierern der abgeleiteten Klassen überlassen sollten, um es richtig zu machen, oder einfach darauf vertrauen, dass sie es tun werden.

Eine andere Antwort hat gezeigt, was als merkwürdig wiederkehrendes Vorlagenmuster bekannt ist. Dort haben Sie eine Basisklasse, die versucht, das Typsystem zu verwenden, um zu erzwingen, dass abgeleitete Typen sich bei bestimmten Eingaben oder verwenden Ausgabepositionen.

%Vor%

Diese Idee könnte in anderen Sprachen funktionieren. Es funktioniert nur in C # soweit die Leute es richtig benutzen. Mit der obigen Definition von Bar kann ich jetzt auch

haben %Vor%

Was vollkommen legal ist. Bar ist ein Foo<Bar> , das ist alles was benötigt wird um es zu benutzen. Nichts erfordert, dass Baz tatsächlich Foo<Baz> verwendet.

Das Typsystem in C # kann einfach nicht durchsetzen, was Sie erzwingen möchten. Auch wenn dieses Muster vorhanden ist, befinden Sie sich immer noch in der gleichen Position wie zuvor. Sie müssen immer noch den Implementierern der abgeleiteten Klassen vertrauen, um es richtig zu machen.

Weitere Informationen zu diesem Thema finden Sie in diesem Blog unter .

    
Anthony Pegram 20.02.2012 13:06
quelle

Tags und Links