15 Nov
2006

Interfaces müssen nicht implementiert werden!

 

Aus der Abteilung, Sprachfeatures die vielleicht nicht jeder kennt. Derzeit ja schwer in Mode in den Blogs :), ein Trend auf den ich mal aufspringe.     Diesmal das Interface:   

"Landläufige" Meinung: Erstellt man ein Interface, dann muss eine darauf aufbauende Klasse alle Methode und Eigenschaften implemtieren. Falsch[:  Muss sie nicht!   Jedenfalls nicht wenn sie schon implemtiert sind, z. B. in einer Basisklasse. Und dies ist auch ganz praktisch. Dies zeige ich hier an einem einem Beispiel.    

Wenn ich z.B. mit dem Modell View Presenter Pattern [1] eine Anwendungsoberfläche erstelle und dort den Presenter einen passiven View steuern lasse. Dann braucht der Presenter, je nach Variation des MVP-Patterns, Zugriff auf die Controls, jedoch ist es nicht unbedingt ratsam die eigentliche Control-Objekte nach "draußen" zu führen.

Da man sich damit die Möglichkeit verbaut den Presenter auch für verschiedenen View-Variationen einzusetzen.     Denn stellt man es halbwegs geschickt an, so kann der gleiche Presenter für WebForms, WinForms oder GTK# (bei Mono) eingesetzt werden. So das ein großteil der GUI Logik (füllen mit Daten, Zustände der Controls, Überprüfung der Eingaben) nur einmal geschrieben werden muss.    Leider hat Microsoft beim .NET Framework es ja verpasst die ASP.NET Controls und WinForms Controls auf eine halbwegs gemeinsame Basis zu stellen. Doch mit Interfaces kann dem ein wenig nachgeholfen werden. Ohne das man, bei den meisten Controls, viel Programmieren muss.    So habe ich z.B. in einer Anwendung mir folgende Interfaces definiert um z.B. einen Button zu steuern.   

public interface IControl
{
    bool Enabled { get; set; }
    bool Visible { get; set; }
    void Focus();
}

public interface IButton : IControl
{
    string Text { get; set; }
    event EventHandler Click;
}

Damit ich mit dem Interface auch arbeiten kann muss ich mir selbstverständlich einen eigenen Button erstellen, der darauf basiert. Denn ein Arbeiten mit <asp:Button /> fällt flach, da er weder dieses Interface noch ein anderes ähnliches Interface kennt.    Doch mit diesem gewählten Interface fällt die Implementierung eines eigenen Buttons trotzdem sehr klar und einfach aus.   

namespace DerAlbert.BaseControls.Web
{
    public class Button : System.Web.UI.WebControls.Button, IButton
    {
    }
}

Das war es schon, fertig ist mein eigener Button und kann einer Webanwendung einsetzen. Das Interface muss nun nicht mehr implementiert werden, da die Basisklasse schon eine Implementation der Methoden und Eigenschaften zu Verfügung stellt, unabhängig von meinem Interface.    Dies ist ein wesentlicher Unterschied zwischen Interfaces und rein abstrakten Klassen wie sie z.B. in C++ eingesetzt werden um ähnliches zu erreichen.    In der Anwendung sieht dies dann so aus, ich definiere eine Inteface für ein View 

namespace DerAlbert.Community.Views
{
    public interface IImagesEditView : IView
    {
        IButton ButtonSave { get; }
    }
}

    Nun baue ich mir eine entsprechende Form auf Basis dieses Interface und entwickle den Presenter gegen dieses Interface. Fertig ist mein universeller Presenter.    Mit einem WinForm Button ist dies auch möglich, so kann ich den Presenter gegen das Interface des Controls entwickeln und muss mich nicht drum kümmern ob WinForm, WebForm und hoffentlich auch WPF.    Natürlich ist nicht jedes Control so einfach umzusetzen. Für ein DropDownList oder TreeView muss man schon ein paar Hindernisse aus dem Weg räumen um sowohl das Control sowie ListItem und TreeNode mit einem Interface zu versehen.    Auch gleichen sich WebForm und WinForm nicht in allen Controls so einfach wie beim Button, dann muss man halt dass was jeweils anders ist nachprogrammieren. Doch dies ist ein einmaliger Aufwand.   

  [1] http://martinfowler.com/eaaDev/


Der Eintrag ist mir etwas Wert
 

Feedback

# re: Interfaces müssen nicht implementiert werden!

left by Flominator at 7/14/2009 6:43 PM Gravatar
Hallo Albert, toller Tipp.

Danke, dass du ihn in der Session am Samstag erwähnt hast. Schade nur, dass die Formatierung ein klein wenig Arbeit macht ...

Gruß aus dem Schwarzwald

# re: Interfaces müssen nicht implementiert werden!

left by Der Albert at 7/16/2009 10:04 PM Gravatar
War ein alter Artikel noch aus Zeiten von Serendipity. Habe ihn nun "gehübscht".

# re: Interfaces müssen nicht implementiert werden!

left by Flominator at 7/19/2009 7:25 PM Gravatar
Dankeschön. Schade, dass du dich von s9y getrennt hast.
Comments have been closed on this topic.