Zitat: |
@ Ralf
Verstehe ich dich richtig: du hast eine statische Methode in einer Klasse A. Diese Methode erzeugt - je nach Wert der Parameter - ein Objekt vom Typ B, welcher von A abgeleitet wird? Das würde dann aber bedeuten, dass die Basisklasse (A) alle Ableitungen kennen müsste (B). Außerdem wäre ja dann die Methode in einer anderen Klasse definiert. |
Die B's können im Zweifel auch irgendwas dynamisches sein was zur Compilezeit noch gar nicht bekannt ist (z.B. weil es ein Plugin System ist). Aber man braucht natürlich einen Ansatzpunkt um an konkrete Klassen zu kommen ohne die konkret zu kennen. Da ist eine Create Methode an einer Basisklasse ein möglicher Weg.
Solche Create Methoden sind ein übliches Muster im Framework (ohne dabei irgendwas mit Plugins zu tun zu haben) Beispiele :
- Delegate.CreateDelegate (liefert MulticastDelegate)
- Array.CreateInstance (liefert konkretes Array abhängig vom übergebenen Typ)
- im Cryptography Namespace haben eigentlich alle Basistypen eine Create Methode der man den konkret gewünschten Algo (der eine Ableitung der Basisklasse darstellt) mitgeben kann
Zitat: |
Ja aber das kann doch genau so gut im Konstruktor passieren.
Color.FromArgb(...) fällt mir gerade noch als Beispiel ein. |
Ein Konstruktor hat wie jfheins nebenbei aufzeigt extrem schlechte dokumentarische Eigenschaften. Gerade bei Color ist es eben nicht genauso lesbar machbar. Da Graphics eine ganze Reihe von FromXXX Methoden hat mag das dort auch ein Grund sein.
Meine Theorien nach 2.ter Überlegung bezüglich Graphics ist eine andere
Die Methode hat erst im 2.0er Framework Einzug gehalten so wie die anderen FromXXX Methoden. Die 1er Philosophie von Graphics ist aber vermutlich das man die nicht selbst erzeugen können soll.
Ein Graphics Object macht ja auch isoliert keinen Sinn es ist immer nur ein Wrapper um einen GDI Context der an einem Control hängt und man holt sich den vom Control (Control.CreateGraphics) und erzeugt den eben nicht selber. Das man den auch für ein Image gebrauchen kann ist denen dann erst später eingefallen da stand die Philosophie aber schon. Beim Designermeeting Graphics.FromImage vs. Image.CreateGraphics hat sich dann erstere Partei durchgesetzt. Die Überlegung könnt aber auch nur eine Verschwörungtheorie sein
Worauf ich hinaus will im Rückblick auf ein Design ist es leicht historische Notwendigkeiten (ich wage es nicht da von Schwäche zu sprechen über die Stabilität der Designphilisophie der ursprünglich erdachten Muster kann ich nur staunen) zu übersehen die sich oft nur den direkt Beteiligten erschließen. Wir können nur hoffen das ein paar Microsoft Insider in ihren Blogs über solche Details schreiben und uns den Entstehungsweg eines Features im Framework aufzeigen.