Laden...

Was ist ein Interface

Erstellt von awex vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.775 Views
A
awex Themenstarter:in
6 Beiträge seit 2004
vor 19 Jahren
Was ist ein Interface

Hallo,

ich habe mich denke ich relativ gut in die OOP / Design eingearbeitet...
Bis auf die Tatsache, dass mir die Verwendung von Interfaces noch nicht klar ist.

Wer kann mir helfen, oder noch besser, an einem konkreten Beispiel zeigen, wie ich Interfaces sinnvoll einsetzten kann...

Danke!

F
529 Beiträge seit 2003
vor 19 Jahren

Also,
Interfaces sind in erster Linie eine Beschreibung vom Mindestaufbau einer Klasse, die ein Interface "implementiert". Also erbt diese Klasse dieses Interface und implementiert die im Interface festgesetzten Funktionen und Felder. Dazu ein Beispiel:


interface IView
{
  void PrintTokens(string Tokens);
  string GetTokens();
}

class Test : IView  //Muss alle Methoden aus IView implementieren
{
  //...
  void main(object args[])
  {
   //
  }
  private void PrintTokens(string Tokens)
  {
     Console.WriteLine(Tokens);
  }

  public string GetTokens() //Ich mach die Implementationen immer public, ka ob man   das muss
  {
    return Console.ReadLine();
  }
}

Nun kann man damit aber noch mehr machen, nämlich von einer Klasse mittels eienr Interfaceinstanz eine Funktion in einer anderen Klasse aufrufen, die eine Instanz der ersten Klasse besitzt:


interface IView
{
  void WriteMsg(string Msg);
}

class Test1 : IView
{
  public void main
  {
     Test2 t = new Test2((IView) this);
  }

  public  WriteMsg(string Msg)
  {
     Console.WriteLine(Msg);
  }
}

class Test2
{
  Test2(IView interface)
  {
     interface.WriteMsg("Hallo in Klasse Test1");
  }
}

In Test1 implementiere ich ein Interface. Denn rufe ich irgentwo in Test1 eine Funktion auf, die Test2 instanziiert. Dabei wird dem Konstruktor ein in das Interface gecasteter this mitgegeben, damit man aus der Test2 auf die Interfaceimplementationen in Test1 zugreifen kann.

Ok, das ist jetzt nicht sehr informativ, ich will das morgen überarbeiten, aber nun bin ich sooo müde

mfg
Franknstein

Besuchen sie das VisualC++ - Forum

C
1.215 Beiträge seit 2004
vor 19 Jahren

ein interface ist einer klasse ähnlich, von der man erbt.
allerdings sind in einem interface sämtliche members lediglich abstract definiert - sprich, wenn du ein interface implementierst, musst du die methoden und eigenschaften selber schreiben.
es ist also nur eine art schnittstellen-vereinbarung.

interfaces sind im grunde ein äquivalent zur mehrfachvererbung, die wir von c++ kennen.
in c++ kann man von mehrerern klassen gleichzeitig erben - das geht in c# oder java nicht - daher gibst interfaces, von denen man beliebig viele in einer klasse implementieren kann.

wenn du ein interface implementierst, ist später klar, dass die entsprechende klasse auf jeden fall über die methoden und eigenschaften dieses interfaces verfügt, egal wie diese nun ausgeführt werden.

z.b. gibt es das interface 'IDisposable' mit der methode 'Dispose()'.
wenn du dies interface implementierst, musst du die methode 'Dispose()' selber formulieren - sie soll nicht-gemanagede ressourcen freigeben.
jemand, der deine klasse benutzt, weiss, dass er mittels dieser methode später zu jeder zeit die entsprechenden ressourcen freigeben kann.

grtz
chief

A
awex Themenstarter:in
6 Beiträge seit 2004
vor 19 Jahren

hallo,

vielen dank für eure nachrichten!

ok, das habe ich verstanden, dass einzigste was ich jetzt noch bräuchte, wäre ine erklärung, warum ich interfaces nutzen sollte...

hmm , mal so ins blaue, welchen nutzen habe ich von interfaces?

F
529 Beiträge seit 2003
vor 19 Jahren

Du nimmst interfaces nur dann wenn du sie brauchst. Du brauchst sie zum Beispiel, wenn du forderst, wie Klassen aufgebaut sein müssen. Das kannst du zum Beispiel gut Plugins mit realisieren. Plugin laden -> ins Interface casten und dann die entsprechenden Methoden aufrufen. Dazu gibt es hier schon ein paar Themen.

Aber meist verwendet man Interfaces zur Komunikation zwischen Klasseninstanzen. Also stell dir vor, du hast zwei Fenster in deinem Programm. Dann implementiert das Fenster 1 ein Interface und gibt dem Fenster 2 eine Instanz des Interfaces. Dann kann Fenster2 die im Interface definierten Methoden aufrufen. (Und damit zum Beispiel dafür sorgen, dass das Fenster1 sich schließt....)

--
mfg
Franknstein

Besuchen sie das VisualC++ - Forum

333 Beiträge seit 2004
vor 19 Jahren

Interfaces sind sinnvoll, wenn du festlegen möchtest das eine Klasse ein bestimmte Funktionalität beinhaltet. Am besten man wirft einen Blick auf das .NET-Framework. Dort wimmelt es ja nur so von Interfaces. Ein schönes Beispiel ist IEnumerable. Die richtige Implementierung dieses Interface garantiert, das du ein foreach auf ein Objekt dieser Klasse ausführen kannst. Das Interface beinhaltet nur eine Methode, die heißt GetEnumerator() und die gibt ein Enumerations-Objekt zurück, welches für die Vearbeitung einer foreach Schleife wichtig ist. Ein Enumerator wird wiederum durch die Schnittstelle IEnumerator definiert. Dort sind alle Eigenschaften und Methoden, die einen Enumerator auszeichnen.

Chief Brodie
interfaces sind im grunde ein äquivalent zur mehrfachvererbung, die wir von c++ kennen.

Ne, da ist noch ein ziemlicher Unterschied. Schnittstellen ersetzen keinesfalls die Mehrfach-Vererbung, es sei denn du möchtest den Quellcode jedesmal kopieren. Bei Mehrfach-Vererbung hast du ja wirklich die komplette Funktionalität der geerbten Klassen, während bei Schnittstellen nur der reine Rumpf existiert. Du hast also keine Garantie ob die Methoden und Eigenschaften wirklich das machen, was man gerne hätte.

([bb]|[^b]{2})

A
awex Themenstarter:in
6 Beiträge seit 2004
vor 19 Jahren

ok, aber wieso höhre ich immer das wort schnittstelle /interface in verbdinung mit wiederverwendungsfähigem code oder datenbankabstraktion?

L
667 Beiträge seit 2004
vor 19 Jahren

Hallo !

Interfaces sind auch oft brauchbar um zirkuläre Abhängigkeiten in größeren Projekten zu vermeiden. Mal angenommen, Du hast zwei Klassenbibliotheken. In der einen befindet sich eine Klasse A, in der anderen eine Klasse B. Wenn es nun dazu kommt, dass die Klasse A Sachen aus Klasse B benutzen will und B gleichzeitig Sachen aus Klasse A verwenden will, kriegst Du eine zirkuläre Abhängigkeit, wenn beide Assemblies sich gegenseitig referenzieren. Die Lösung ist zu jeder Klasse ein Interface zu schreiben und diese Interfaces in eine eigene Assembly auszulagern, die meistens TypeDefs.dll genant wird.Damit können beide Klassenbibliotheken nun statt sich gegenseitig zu referenzieren, beide auf die Interface-Assembly referenzieren und sich so problemlos gegenseitig benutzen.

Lies am Besten mal beim Codeproject nach (www.codeproject.com) - da gibt es massenweise gute und leicht verständliche Interface-Artikel für Anfänger.

"It is not wise to be wise" - Sun Tzu

C
1.215 Beiträge seit 2004
vor 19 Jahren

_Original von NoOneKnows_Ne, da ist noch ein ziemlicher Unterschied. Schnittstellen ersetzen keinesfalls die Mehrfach-Vererbung,...

ja, da hast du allerdings recht.
es ist natürlich kein äquivalent zur mehrfachvererbung - eben gerade weil alle members abstrakt sind in interfaces.
es ist eben nur die garantie des vorhandenseins der entsprechenden members und keine garantie auf die art der ausführung.

@ awex:
ein interface macht überall dort sinn, wo du gewisse erwartungen an eine klasse/anwendung stellst, aber noch gar nichts über diese weisst.
sprich - du schreibst vor - dies und das soll die klasse/anwendung machen (egal, wie sie das bewerkstelligt), um sie andernorts einzubinden, ohne dass ich mich um ihre sonstigen funktionalitäten scheren muss.
(plugins sind ein gutes beispiel)

es ist immer wichtig, wenn man abstrakte members in einem interface definiert, dass man eine gute beschreibung (gerade der methoden) beigibt, damit andere, die dieses interface implementieren möglichst genau wissen, was sie für eigenschaften und methoden ausformulieren müssen.

grtz
chief