Announcement

Collapse
No announcement yet.

Class re-instanzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Class re-instanzen

    Ich habe ein Schulbeispiel: im einem Projekt ist eine Komponente oft mal verwendet.
    z.B.:
    public class MyComponent : Component
    {

    public MyComponent()
    {
    InitializeComponent();
    }

    public MyComponent(IContainer container)
    {
    container.Add(this);

    InitializeComponent();
    }
    ....
    }

    Beim einziehen von dem Komponent auf Form macht VisualStudio automatisch this.mycomponent1 = new test.MyComponent(this.components);.
    Das Projekt ist z.B. schon gross und im Einsatzt. Aber dann braucht ein Kunde in der Komponete dass einige Methoden z.B. etwas anders berechnen. Darum würde ich eine neue Klasse ableiten, und im Kundenorden speichern:
    public partial class MyComponentKunde1 : MyComponent
    {
    ... hier werden betrefende Methoden geändert
    }
    Aber überal im Projekt wird nur MyComponent instanziert und ich bräuchte dass irgendwie automatisch wird MyComponet "uminstanziert" auf MyComponentKunde1, falls die Komponet vorhanden ist. Und möchte nicht bei jedem neuen Kunde das gesamte Projekt durchsuchen, wo MyComponent verwenden ist und überal neue Kundenabfrage hinzufügen.
    Meine Idee wärre, das die Komponete MyComponet selbe nachschaut, ob es im Kundenordner eine abgeleite Klasse gibt, falls ja, dann die wird anstatt MyComponet verwendet, dass sich die Klasse selbe uminstanziert.

    D.h. überal im Projekt bleibt ungeändert die Verwendung von MyComponet this.mycomponent1 = new test.MyComponent(this.components); mycomponent1.RechneEtwas();, aber die abgeleitete Klasse MyComponentKunde1 benutz wird, falls vorhanden.
    Die Idee ist, dass die andere Programmier sich nicht kümmern mussen, ob es von der Klasse MyComponet eine Kundenspezifische Ableitung vorhanden ist, die sollen nur MyComponet verwenden wie vorher. Dann sind noch andere Programmier da, die machen Kundenspecifische Ableitungen von Klassen, aber die kümmern sich nich um verwendung von der Komponenten.
    Hätte jemand eine Idee, wie kann man das Problem lösen ? Für jede Hilfe bin ich dankbar.

    Entschuldigen Sie, bitte meine deutsche Sprache!

  • #2
    Ohne Codeänderung (zumindest initial) wird es nicht gehen.

    Damit erst zur Laufzeit entschieden wird welche konkrete Ableitung einer Klasse instanziiert werden soll darf an der betreffenden Stelle nicht einfach 'new' stehen. Du brauchst eine Instanz die aufgerufen wird und dir anhand einer Konfiguration oder sonstigen Kriterien die dann relevante Ableitung liefert.

    Sieh dir für eine Lösung zum Beispiel das Fabrik-Pattern und/oder Dependency Injection an.

    Comment


    • #3
      Danke für schnelle Antwort, ich habe mich gedacht, dass es nicht so geht, aber ich hoffte dass doch. Die Codeänderung von Instanzieren der Komponete wird sehr umständig. Eine nicht so saubere Lösung hätte ich:
      public class MyComponent : Component
      {
      private MyComponent _my;

      public MyComponent()
      {
      InitializeComponent();
      CustomSpecClass();

      }

      public MyComponent(IContainer container)
      {
      container.Add(this);
      InitializeComponent();
      CustomSpecClass();

      }

      private CustomSpecClass
      {
      _my = this;
      falls Kundenspecifische Klasse vorhanden ist, dann die in _my instazieren.

      }
      public void RechneEtwas()
      {
      if(_my != this)
      {
      _my.RechneEtwas();
      return;
      }

      .... Code .....
      }
      ....
      }

      Alle Properties und Methoden so anpassen wie die Methode RechneEtwas. Aber diese Lösung wollte ich vermeiden.

      Das Problem ist, dass die andere Programierer sollten eine Komoponte beim Entwicklen in VisualStudio mit Maus einziehen und VisualStudio legt die Instanzierung automatisch an. Und erst, wenn das Programm beim Kunde läuft,
      soll die Kundespezifische Ableitung einer Klasse verwendet werden, falls eine Vorhanden.

      Comment


      • #4
        da muss die Komponente alle Funktionen für alle Kunden beinhalten und zur Laufzeit den Kunden abfragen(INI oder Registry) und sich dann kundenspezifisch verhalten.

        Comment

        Working...
        X