Portal > Foren > Java > Allgemeine Java-Programmierung > Unterschied zwischen Interface und Vererbung und Sinn???
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 08.02.2005, 10:52 Nach oben    #1
p-flash
Gast
 
Beiträge: n/a
Standard Unterschied zwischen Interface und Vererbung und Sinn???

Hi,

meine erste Frage ist, ich habe folgende interface-Klasse:
Java Code:
  1. public interface VersicherungI
  2. {
  3.      public double berechnePraemie(double Versicherungssumme);
  4. }

Was für einen Sinn hat das? Da ist ja kein Rumpf definiert?

2. Frage wäre, was der Unterschied zu Vererbung genau ist.

Danke schonmal.

p-flash
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 11:10 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

zunächst einmal möchte ich darauf hinweisen, dass du einen formulierungsfehler gemacht hast. es gibt keine "interface-klasse". entweder es ist eine klasse oder es ist ein interface

du hast ein interface. in interfaces stehen nur die signaturen der methode, also das gerüst, der kopf .. wie du es auch nennen willst

wenn du nun das interface implementierst ( implements ), dann musst du alle methoden, die in dem interface angegeben wurden implementieren .. (komischer satz -)
naja. es heißt also, dass du z.b. in diesem beispiel hier:

Java Code:
  1. public interface TestInterface
  2. {
  3.        public void machWas( String text );
  4. }
  5.  
  6.  
  7. public class Demo implements TestInterface
  8. {
  9.         public void machWas( String text )
  10.         {
  11.                // irgendwelcher code
  12.         }
  13. }

die methode machWas( String text ) ausimplementieren MUSST. das ist eine pflicht. auf so etwas trifft man z.b. früh bei dem Interface "ActionListener" und der Methode "acitonPerformed( ActionEvent event ).
falls dir das nichts sagt .. vergiss es

eine klasse kann beliebig viele interface einbinden ... aber nur von einer klasse erben. das ist ein unterschied zu z.b. C++

wenn du nun vererbung hast .... bsp:

Java Code:
  1. class Fahrzeug
  2. {
  3.         public void machGeraeusch( String geraeusch )
  4.         {
  5.               System.out.println( geraeusch );
  6.         }
  7. }
  8.  
  9.  
  10. class Auto extends Fahrzeug
  11. {
  12.         public void berechneKosten()
  13.         {
  14.              /* irgendwas berechnen, was speziell für ein auto ist und was ein fahrrad z.b. nicht hat */
  15.         }   
  16. }
  17.  
  18.  
  19. public class Demo
  20. {
  21.      public static void main( String[] args )
  22.      {
  23.              Fahrzeug toefftoeff = null;
  24.              
  25.              // je nach eingabe / auswahl wird nun ein objekt erstellt
  26.             if( irgendwas )
  27.             {
  28.                    toefftoeff = new Auto();
  29.             }
  30.             else
  31.             {
  32.                    toefftoeff = new Lastwagen();
  33.             }
  34.  
  35.             toefftoeff.berechneKosten();
  36.             toefftoeff.machGerausch( "brumm brumm" );
  37.  
  38.      }   
  39. }

oder so ähnlich

du könntest jetzt in der klasse Auto z.b die methode machGeraeusch() überschreiben. das musst du aber nicht.

wenn du z.b. so etwas machst
Java Code:
  1. class GrafikDemo extends JFrame
dann hast du alle eigenschaften des JFrame zur verfügung, musst sie aber nicht nutzen.

hm. war das verständlich erklärt? irgendwie bezweifle ich das jetzt im nachhinein ^^
naja. danke für das feedback ... bei fragen. raus damit

grüße ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 11:19 Nach oben    #3
p-flash
Gast
 
Beiträge: n/a
Standard

Also ich würde sagen ic hhabe es verstanden, wenn die Antwort auf folgende Frage ja ist:

Sind interfaces also dafür, den Programmierer zu "zwingen" gewisse Methoden oder Attribute in sein Prgramm zuzufügen? Oder was habe ich flasch verstanden?

Danke schonmal für die Antwort.

p-flash
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 11:26 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

hm. so würde ich das jetzt nicht beschreiben. also das problem ist .. ich denke es gibt keine pauschale antwort auf deine frage.
der eine nutzt gerne interfaces, der andere gerne vererbung ein weiterer erbt gerne von adaptern, die ihrerseits ein interface implementieren.

*einschub*
ein adapter ist einfach eine klasse, die alle methoden, die ein interface fordert leer implementiert. also
Java Code:
  1. public void methode()
  2. {
  3. }
wenn man dann den adapter erbt muss man nicht mehr alle methoden implementieren. is tricky, wenn man ein interface immer nur zur hälfte braucht


aber bzgl. deiner frage.
ich kann dir das leider nicht so ganz zufriedenstellend beantworten.

ich würde sagen, dass es am programmierstil, der anforderung und der programmstruktur liegt, was am günstigsten ist.

fakt ist aber, dass ..
... mehrfachvererbung nicht möglich ist,
.. mehrere interfaces implementiert werden können
.. ein interface auch erben kann.

durch das bereitstellen von interfaces schaffst du eien schnittstelle. da nur die methodensignatur feststeht, weißt du zwar wie die methode heißt und du solltest aufgrund des namens auch wissen was sie macht ... wie es implementiert ist ist dann aber erst mal nicht interessant.

soweit .. vielleicht hat noch jemand eine bessere erklärung.


grüße ben.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 11:32 Nach oben    #5
p-flash
Gast
 
Beiträge: n/a
Standard

Jo super. Danke für die gute Erklärug. Bin jetzt um einiges schlauer. Unser Professor erklärt es net so doll.

p-flash
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 11:49 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

hui. danke

na. wie gesagt. ich würde da gerne noch eine erklärung von jemand anderem hören. ist ja schließlich immer besser mehrere meinungen zu haben

grüße ben.


nachtrag:
--------

hier findet man noch eine kurze aussage, die eventuell noch hilfreich ist:
Zitat:
Bemerkenswert ist auch die explizite Unterscheidung von Schnittstellen und Klassen. Eine Klasse kann beliebig viele Schnittstellen implementieren, hat aber stets genau eine Basisklasse. Alle Klassen sind – direkt oder indirekt – von der Wurzelklasse Object abgeleitet.
Quelle: http://de.wikipedia.org/wiki/Java_%2...le_der_Sprache

auch interessant:
Quelle: http://de.wikipedia.org/wiki/Schnitt...grammierung%29

da ist ganz gut beschrieben, was schnittstellen / interfaces so "machen"
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 15:08 Nach oben    #7
ehli75
Gast
 
Beiträge: n/a
Standard

Also ... ihr wollt eine weiter Meinung zu dem Thema ...

Interfaces werden oft dazu benutzt Schnittstellen festzulegen.
z.B.
du hast ein Tool programmiert, welches durch hinzufügen von weiteren Klassen von wildfremden Menschen (die deinen originalen Sourcecode nicht kennen !) erweitert werden kann (z.B. ein Editor, der durch Plugins um weitere Funktionalitäten erweitert werden kann). Um die Erweiterungen einbinden zu können müssen die aber bestimmte Bedingungen erfüllen. Machen wir doch mal ein kleines Beispiel:
Java Code:
  1. public interface Plugin {
  2.      public void execute();
  3. }
Das soll fürs Interface reichen. d.h. ... jeder der ein Plugin für DEIN Tool schreiben will muss das Interface Plugin implementieren und somit die Methode execute() mit Leben füllen.
Java Code:
  1. public class FremdesPlugin implements Plugin {
  2.      public void execute(){
  3.           // mache irgendwelche Schweinereien
  4.      }
  5. }
Dadurch das der Fremdling DEIN Interface implementiert weisst du ganz genau, dass es die Methode execute() dort gibt und du kannst vom Fremden Plugin eine Instance bilden:
Java Code:
  1. try{
  2.      Class c = Class.forName( "FremdesPlugin" );
  3.      Constructor cons = c.getConstructor(null);
  4.      Plugin p = (Plugin)cons.newInstance(null);
  5.      p.execute();
  6. }
  7. catch( Exception e){
  8.      // Fehler fangen
  9. }
Jetzt sieht du den Vorteil von Interfaces (auch wenn es etwas unübersichtlich ist) ... Mittels Reflexion holst du dir eine Instance ... die aber immer vom Typ Object ist (damit alleine könnte man nicht viel anfangen). Aber da du weisst, dass die Klasse DEIN Interface implementiert - und somit auch von Typ deines Interfaces ist !!!!!!!! - kannst du das Object auf ein Plugin casten. Und nun kannst du die Methode execute() aufrufen (die MUSS es ja geben !).

War das zu umständlich ??


OK ... dann eben noch ein zweites Beispiel:
Du hast ein Tool welches mit GUI benutzt werden kann ... nun willst du aber (weil es so korrekter ist) die GUI von der Applikation trennen. Aber die GUI muss ja irgendwie an die Daten kommen, die sie anzeigen soll. Nehmen wir mal an, du hast in deiner Applikation eine Adressliste mit vielen tausenden und abertausenden Adressen. Nun willst du nicht jeden einzelnen String vond er Applikation zur GUI transferieren (kann man machen ... aber in unserem Beispiel geht das nicht - warum auch immer ). Deshalb willst du das komplette Adresslisten-Objekt an die GUI reichen ... ist aber eigentlich nicht so toll, da die GUI - die ja von deiner Applikation so wenig wie möglich wissen soll - sonst vollen Zugriff auf das Objekt hat. Nun machst du also ein Interface, welches bestimmte Zugriffsmethoden vorschreibt:
Java Code:
  1. public interface Adresslist {
  2.      public String[] getAllNames();
  3.      public String getAdress( String name );
  4. }
... ein wenig konstruiert ... aber als Beispiel solls genügen. Die Applikation implementiert nun dieses Interface in einer Klasse:
Java Code:
  1. public class AppAdresslist implements Adresslist {
  2.      private String[] names,
  3.      private Hashtable adresses;
  4.  
  5.      public String[] getAllNames(){
  6.           return this.names;
  7.      }
  8.  
  9.      public String getAdress( String name ){
  10.           return (String)this.adresses.get( name );
  11.      }
  12. }
Nun hast du ja auch noch eine Fassaden-Klasse, die die Verbinsung zwischen Applikation un GUI herstellt geschrieben. Über diese kann die GUI nun sich ein Objekt vom Typ Adresslist holen:
Java Code:
  1. public class Fassade {
  2.      private AppAdresslist list;
  3.  
  4.      public Adresslist getAdresslist(){
  5.           return this.list;
  6.      }
  7. }
Im ersten Moment sieht es so aus, als wenn die GUI doch vollen Zugriff auf die Liste hat. Wenn aber genau hinschaut (wie du jetzt gerade) sieht man, das ein Objekt vom Typ Adresslist und nicht AppAdresslist zurückgegeben wird. Nun kann die GUI also nur auf das zugreifen, was im interface definiert worden ist - natürlich vorrausgesetzt, dass die GUI das INterfase kennt -
Java Code:
  1. public GUI {
  2.      private Fassade myFassade = new Fassade();
  3.  
  4.      ...
  5.      Adresslist al = myFassade.getAdresslist();
  6.      String[] allNames = al.getAllNames();
  7.      for( int i=0; i<allNames.length;i++){
  8.           String adr = al.getAdress( allNames[i] );
  9.           ...
  10.      }
  11. }
Klar geworden wie das funzt ? Die GUI hat keinen blassen Schimmer, wie die Adressliste aufgebaut ist ... sie weiss nur, dass es die Methoden getAllNames() und getAdress( String name ) gibt ... das ist alles. DAs Einzigste was jetzt noch doof ist ... ein gemeiner GUI-Programmierer könnte auf die Idee kommen und sein Adresslist-Objekt in ein AppAdresslist-Objekt zu casten ... nun ja ... der hat aber spätestens dann ein Problem, wenn ich Methoden in der Klasse, die nicht zum Interface gehören - er aber trotzdem "verbotener Weise" benutzt - umbenenne oder ganz entferne. Wenn es um sensible Daten geht, darf man das natürlich nicht einsetzen ... aber für die "Normalapplikation" reicht das völlig aus.

ich hoffe ich hab dich nicht all zu sehr gequält ...
ich hab mir aber gedacht ... wenn dann richtig ... da das ein grundlegendes Thema in Java ist (haben andere Programmiersprachen auch sowas wie Interfaces ??). Um "richtig" zu code bzw. vorhandene Frameworks benutzen zu können muss man das Prinzip begriffen haben !!!

Viel Spaß beim Ausprobieren ...
Michael
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 15:43 Nach oben    #8
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

ich finde beide beispiele sehr gelungen. *applaus*
das zweite wird für einen anfänger eventuell noch etwas zu hart sein, da du ja auch das fassaden-pattern verwendest, aber ich finde das hast du ganz gut beschrieben.

btw:
dann war ich aber mit meiner möchtegern-schnittstellen-beschreibung auch gar nicht sooooo weit von deiner erklärung weg

also nochmals: *ThumbsUp*
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.02.2005, 22:41 Nach oben    #9
mic_checker
Gast
 
Beiträge: n/a
Standard

was vielleicht in Bezug auf "Vererbung" noch ganz interessant ist:

Normalerweise ist Vererbung dann sinnvoll wenn eine sog. "Ist ein" Beziehung besteht.

Um auf Bens Beispiel zu verweisen:

- Ein Auto ist ein Fahrzeug

Oder:

- Ein Kreis ist eine Figur

Etc. pp.[/b]


Bei Interfaces gilt außerdem:
- alle deklarierten Methoden im Interface sind implizit "abstract public"
- alle Attribute sind "final public static"
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2005, 09:08 Nach oben    #10
LordOfCodes
Gast
 
Beiträge: n/a
Standard

Das beste Beispiel für die Verwendung von Interfaces ist für mich das Event-Handling unter Java..
Diverse Beispiele hier:
http://www.google.ch/search?hl=de&am...uche&meta=
 
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Unterschied zwischen Kategorisierung (mehrfach) und tagging Ben Anwendungsdesign / Softwarearchitektur 16 16.11.2007 01:39
Unterschied zwischen Format der MySQL-Typen DATETIME und TIMESTAMP Ben Datenbanken 9 20.08.2007 09:32
Eigene Events auf ein Interface schicken. missiju Allgemeine Java-Programmierung 2 08.12.2005 22:38
Unterschied zwischen $_SERVER['REQUEST_TIME'] und time() Ben PHP-Programmierung 13 12.11.2005 22:03
Unterschied zwischen HashMap und Hashtable? Linuxhippy Allgemeine Java-Programmierung 4 18.10.2004 13:37


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45