Interface mit bestehender Klasse verbinden



  • Gibt es eine Möglichkeit, ein Interface mit einer bereits bestehenden Klasse zu verbinden?

    Beispiel:
    Es gibt zwei Klassen, die beide eine Funktion mit Namen X haben. Aber beide Klassen haben nichts miteinander zu tun.

    Nun möchte ich eine Funktion schreiben, die ein Objekt von einer dieser beiden Klassen als Parameter übernimmt und dort die Funktion X aufruft.
    Aber da die Klassen nichts miteinander zu tun haben, geht das natürlich nicht.
    Deshalb wollte ich ein Interface deklarieren mit der Funktion X und dann irgendwo sagen: Verknüpfe Klasse 1 mit dem Interface und verknüpfe Klasse 2 mit dem Interface und behandle sie so, als würden sie wirklich dieses Interface implementieren.

    Ist so etwas möglich?

    Praktisches Beispiel:
    Die Klassen
    System.Windows.Forms.DataVisualization.Charting.Chart
    und
    System.Web.UI.DataVisualization.Charting.Chart
    sind, was ihre Properties angeht, nahezu identisch. Allerdings sind sie nicht in derselben Hierarchie.
    Wenn ich nun Funktionen zum Generieren so einer Charting-Komponente schreibe, dann würde ich gerne ein Interface deklarieren, das alle Properties beinhaltet, die ich brauche, um dann eben sagen zu können: Meine Funktion kann entweder das Forms-Chart oder das Web-Chart als Parameter übernehmen.



  • Nein, so direkt geht das nicht.
    Es gibt aber das Adapter Pattern.



  • Gibt es für dieses Pattern eigentlich auch ein Beispiel mit einfachem Anschauungscode?

    Ich meine, wenn ich Tutorials zu dem Thema sehe: Da wird was mit Primzahlen gemacht, mit "chemical compounds", mit Prozessoren.

    Haben die alle nen Sockenschuss? Können die keine simplen Beispiele nehmen, die jeder sofort kapiert? Irgendwas mit Tieren oder Fahrzeugen?

    Dann hat jedes Tutorial dasselbe kopierte UML-Diagramm, das ich nicht verstehe, und dieses dämliche Gequatsche von wegen adaptor und adaptee. Was soll der Mist? Können die sich nicht mal n bisschen klarer ausdrücken?

    Ich meine, mein Problem war, dass ich zwei Klassen mit gleichnamigen Funktionen habe, die auch das gleiche machen (nur eben einmal für Web und einmal für Forms). Und ich will, dass neu geschriebene Funktionen auf beide dieser Klassen angewandt werden können, wenn man Objekte dieser Klassen als Parameter übergibt?

    Einfaches Beispiel:
    Eine Klasse Lion und eine Klasse Bear haben beide die Methoden Hunt und Roar, aber sie leiten nicht von einer gemeinsamen Klasse oder einem gemeinsamen Interface Animal ab.
    Das Problem: Wie kann ich jetzt (in einer komplett anderen Klasse) eine Funktion SimulateADayInTheLifeOfAnAnimal deklarieren, die sowohl Löwe, als auch Bär als Parameter übernehmen kann und die dann jeweils Hunt und Roar aufruft, one dass ich den Parameter als object deklariere und jedesmal abfrage:

    if (animal is Bear)
        ((Bear)animal).Hunt();
    else if (animal is Lion)
        ((Lion)animal).Hunt();
    else
        throw new NotImplementedException();
    

    What the fck soll jetzt der adaptor* und was der adaptee sein?

    Also entweder dieses Thema hat nichts mit meinem Problem zu tun oder keiner ist in er Lage, das simpel zu erklären. Wie kann man nur eine Programmiertechnik erklären, indem mal als Objekte "chemical compounds" nimmt?



  • Hast du vielleicht selbst nen "Sockenschuss" (was auch immer das bedeuten soll)?

    Und ich will, dass neu geschriebene Funktionen auf beide dieser Klassen angewandt werden können, wenn man Objekte dieser Klassen als Parameter übergibt?

    Genau das geht eben nicht. Hab ich schon geschreiben. Dass du es trotzdem willst ist mir wurst, ändert nix.

    Du musst einen ADAPTER übergeben statt des originalen Objekts:

    interface IBarAdapter
    {
        void MakeDrink();
    }
    
    // ...
    
    class Foo
    {
        public static void DrinkDrinkDrink(IBarAdapter bar)
        {
            bar.MakeDrink();
        }
    }
    
    // ...
    
    class XBarAdapter : IBarAdapter
    {
        public XBarAdapter(X x)
        {
            m_x = x;
        }
    
        public void MakeDrink()
        {
            m_x.MakeDrink();
        }
    
        private X m_x;
    };
    
    class YBarAdapter : IBarAdapter
    {
        public XBarAdapter(Y y)
        {
            m_y = y;
        }
    
        public void MakeDrink()
        {
            m_y.MakeDrink();
        }
    
        private Y m_y;
    };
    
    // ....
    
        void DoSomething(X x)
        {
            Foo.DrinkDrinkDrink(new XAdapter(x));
        }
    

    Einfach genug?



  • BenderFuturama schrieb:

    Haben die alle nen Sockenschuss? Können die keine simplen Beispiele nehmen, die jeder sofort kapiert? Irgendwas mit Tieren oder Fahrzeugen?

    Ich hab zwar keine Ahnung wo du nachgeschaut hast, aber das Beispiel auf Wikipedia fand ich sehr anschaulich und gut beschrieben, noch einfacher wirds nicht werden denk ich mal 😉



  • Hat sich erledigt. Ich hab mir inzwischen ne PlayStation 4 gekauft.



  • BenderFuturama schrieb:

    Hat sich erledigt. Ich hab mir inzwischen ne PlayStation 4 gekauft.

    😃 😃 😃


Anmelden zum Antworten