Verständnisprobleme bei Interface

  • Verständnisprobleme bei Interface

    Hallo liebe Community!,

    Wie schon der Titel sagt hab ich nicht richitig die Funktionsweise von Interface. Nehmen wir mal ein Beispiel. Bei der Abstrakten Klasse kann ich z.B einen String(oder auch einen anderen Datentyp) erstellen. Wenn ich nun eine zweite Klasse erstelle und daran die Abstrakte Klasse dranhänge werden die Elemente von der Abstraken Klasse in der neuen Unterklasse übernommen. So kann man das als Herarchie verstehen.

    Wie ist das jetzt bei Interface? Werden da auch Werte festgelegt und dann von den Unterklassen übernommen?

    Wie kann ich das genau verstehen? Gib es anschauliche Bilder wo man es erläutern kann? Eine Art Zeichnung?

    Hier mal ein Beispiel:

    Quellcode

    1. // Code kopiert von => http://msdn2.microsoft.com/de-de/library/87d83y5b(VS.80).aspx
    2. // keyword_interface_2.cs
    3. // Interface implementation
    4. using System;
    5. interface IPoint
    6. {
    7. // Property signatures:
    8. int x
    9. {
    10. get;
    11. set;
    12. }
    13. int y
    14. {
    15. get;
    16. set;
    17. }
    18. }
    19. class Point : IPoint
    20. {
    21. // Fields:
    22. private int _x;
    23. private int _y;
    24. // Constructor:
    25. public Point(int x, int y)
    26. {
    27. _x = x;
    28. _y = y;
    29. }
    30. // Property implementation:
    31. public int x
    32. {
    33. get
    34. {
    35. return _x;
    36. }
    37. set
    38. {
    39. _x = value;
    40. }
    41. }
    42. public int y
    43. {
    44. get
    45. {
    46. return _y;
    47. }
    48. set
    49. {
    50. _y = value;
    51. }
    52. }
    53. }
    54. class MainClass
    55. {
    56. static void PrintPoint(IPoint p)
    57. {
    58. Console.WriteLine("x={0}, y={1}", p.x, p.y);
    59. }
    60. static void Main()
    61. {
    62. Point p = new Point(2, 3);
    63. Console.Write("My Point: ");
    64. PrintPoint(p);
    65. }
    66. }
    Alles anzeigen


    MfG
    Daniel :)
  • Hallo,

    eine Abstrakte Klasse kann Methoden und Attribute implementieren, genauso wie eine normale Klasse. Nur das man eben keine Objekte einer Abstrakten Klasse erstellen kann. Ein Interface ist im Grunde das gleiche, nur das die Methoden nicht implementiert werden, sondern lediglich vorgegeben wird welche Methoden vorhanden sein müssen(!). Dh. eine Klasse die von einem Interface erbt, muss zwingend dessen Methoden implementieren. Eine Klasse die von einer Abstrakten Klasse erbt, muss die Methoden nicht zwingend implementieren sondern kann diese direkt verwenden (falls entsprechend implementiert).

    Achtung Beispiel *g*
    Wenn du eine Datenbank Klasse erstellen willst (die an konkreten DB-System-Klassen vererbt ... z.B. MySql, PGS) ist eine connect Methode eigentlich immer nötig. Es würde aber keinen Sinn machen diese schon zu implementieren, da die Implementierung immer verschieden ist und du sie ohnehin jedesmal überschreiben müsstest. Also erstellst du nur ein Interface was sagt "Alles was von mir erbt, muss eine connect Methode implementieren. Bum.".


    Hoffe das ist verständlich und hilft dir weiter :)


    Gruß,
    X-Eon
  • @X-Eon: So richitg hab ich Dich nicht verstanden :(

    Machen wir's mal andersrum. Ich schreibe wie ich es denke, Ihr sagt ob es richitg ist oder nicht. ;)

    Abstrakte Methoden: Bei Abstrakten Methoden kann nur von oben nach unten geerbt werden. Also wen nich in der Abstrakten Klasse einen Wert anlege kann es die Kinderklasse erben, anderrum nicht. Von außen kann man nich zugreifen.

    Interface: Wenn ich bei einem Interfach eine Methode hinschreibe und in einer Unterklasse das Interfach angebe mit dem Doppelpunkt bei der Klassennamen kann nur die Methode aufgerufen werdn die im Interfache geschrieben ist. Wenn ich keine Methode schreibe kann auch die Methe(n) nicht aufgerufen werden.


    Hab ich das so richitg verstanden? Hoffendlich ist es mal andersrum besser ;)


    MfG
    Daniel :)
  • ;) Wenn ich dich richtig verstanden habe, dann ist das nicht ganz richtig.

    Vererbt wird immer nur in eine Richtung. Nämlich von der Basisklasse zur Kindklasse.

    Eine Abstrakte Methode (man muss zwischen Abstrakten Methoden und Abstrakten Klassen unterscheiden!) wird der Kindklasse vererbt mit der Vorgabe diese noch zu implementieren.
    Eine Abstrakte Methode ist nur die Signatur.

    Basisklasse

    Quellcode

    1. public abstract void meineMethode();


    Kindklasse

    Quellcode

    1. public void meineMethode() {
    2. // Funktionalität
    3. }



    Wenn eine Klasse eine Abstrakte Methode implementiert, muss die Klasse auch abstrakt sein. Dh. du kannst von dieser Klasse keine Instanzen erzeugen (mit new oder _gcnew).
    Eine Abstrakte Klasse hingegen muss keine abstrakte Methoden enthalten. Wenn du in einer Abstrakten Klasse eine nicht abstrakte Methode hast kann deine Kindklasse die Methode verwenden, ohne diese zu überschreiben.


    Das Interface implementiert auch nur die Signaturen von Methoden. Wenn deine Klasse ein Interface implementiert, dann müssen auch alle Methoden, die im Interface vorgegeben sind, implementiert werden.

    Interface

    Quellcode

    1. public void meineMethode();


    Klasse

    Quellcode

    1. public void meineMethode() {
    2. //Funktionalität
    3. }





    Sowohl im Interface als auch bei der Abstrakten Methode wird nur die Signatur definiert und die Methode muss dann von der Kindklasse implementiert werden. Die Unterschiede liegen zum einen in den Attributen, denn Attribute von Interfaces sind constant. Und zum anderen in der Möglichkeit, dass eine Abstrakte Klasse sowohl Abstrakte als auch nicht Abstrakte Methoden enthalten kann. Ein Interface ist ein reiner Bauplan, eine Abstrakte Klasse kann auch schon Logik vorgeben.


    Hoffe das ist nun verständlicher :rolleyes: Bin glaube ich nicht zum Lehrer geboren ^^