# Abstrakte Klassen



## David2456 (25. Jan 2016)

Hallo
Ich bräuchte Hilfe bei folgender Aufgabe. 
1) Stimmt das so mit der abstrakten Klasse und den Unterklassen?
2) Versuche mich grade an dem printInformations . Wie werden denn die Werte hinter dem new Object übergeben? Bzw. wie schreibe ich diese Methode?

Hauptprogramm

```
public class Main {

    public static void main(String[] args) {
    // Has to be a syntax error:
    // CommunicationDevice c = new CommunicationDevice("c");

    CommunicationDevice compA = new Computer("Comp A", "0.0.0.1");
    CommunicationDevice compB = new Computer("Comp B", "0.0.0.2");
    CommunicationDevice phoneA = new SmartPhone("SmartPhone A");
    CommunicationDevice phoneB = new SmartPhone("SmartPhone B");
    CommunicationDevice faxA = new Fax("Fax A", "1234");
    CommunicationDevice faxB = new Fax("Fax B", "5678");
   
   // compA.addContact(phoneA);
   // compA.addContact(faxA);
   
    Out.println("//generated by printInformations()-calls:");
    compA.printInformations();
    compB.printInformations();
    phoneA.printInformations();
    phoneB.printInformations();
    faxA.printInformations();
    faxB.printInformations();
   
   /* Out.println();
    Out.println("//generated by compA.receiveMessage(compB):");
    compA.receiveMessage(compB);
    Out.println();
   
    Out.println("//generated by compB.sendMessage(compA):");
    compB.sendMessage(compA);
    Out.println("//generated by phoneB.sendMessage(faxB):");
    phoneB.sendMessage(faxB);
    Out.println("//generated by phoneB.sendMessage(compB):");
    phoneB.sendMessage(compB);
    Out.println("//generated by faxB.sendMessage(compB):");
    faxB.sendMessage(compB);

    Out.println("//generated by compA.broadcast():");
    compA.broadcast();
    */
    }
   
}
```
Abstrakte Oberklasse

```
abstract class CommunicationDevice {

        //void addContact();
       // void printInformations();                 
       // void receivedMessage();
        //void sendMessage();
        //void broadcast();
       
       
}
```

Unterklasse

```
public class Computer {

        private String Name;
        private int IP;

        //void addContact();
        // void printInformations();   
        //void receivedMessage();
        //void sendMessage();
        //void broadcast();
       
       
}
```

Unterklasse

```
public class Smartphone {

        private String Name;
       

        //void addContact();
        // void printInformations();   
       // void receivedMessage();
       // void sendMessage();
       // void broadcast();
}
```

Unterklasse

```
public class Fax {
       
        private String Name;
        private int FaxNumber;

       
       // void addContact();
        // void printInformations();   
       // void receivedMessage();
       // void sendMessage();
        //void broadcast();
}
```

Danke schonmal


----------



## Joose (25. Jan 2016)

David2456 hat gesagt.:


> 1) Stimmt das so mit der abstrakten Klasse und den Unterklassen?



Nein, du hast hier einfach eine abstrakte Klasse und 3 nicht abstrakte Klassen, welche in keinen Zusammenhang stehen.
Du solltest die 3 nicht abstrakten Klassen vielleicht noch von der abstrakten Klassen erben lassen  (Stichwort: extends)



David2456 hat gesagt.:


> 2) Versuche mich grade an dem printInformations . Wie werden denn die Werte hinter dem new Object übergeben? Bzw. wie schreibe ich diese Methode?



Was soll die Frage "Wie werden denn die Werte hinter dem new Object übergeben?" bedeuten? Welche Werte? Hinter welchem "new Object"?
Die Methode "printInformations" gibt einfach Sachen auf der Konsole aus. Sprich die abstrakte Basisklasse deklariert dazu eine abstrakte Methode (damit wird jedes Unterklasse gezwungen diese zu implementieren) und in der Unterklasse implementierst du diese Methode das entsprechende Ausgabe rauskommt.


----------



## David2456 (26. Jan 2016)

Ok das mit den Klassen habe ich jetzt verstanden. Danke dir.
Aber ich habe ja jetzt in meinem Main.java das hier
 CommunicationDevice compA = new Computer("Comp A", "0.0.0.1"); 
nun will ich das die Werte in der Klammer in die Klasse Computer.java übergeben werde. Sprich wenn ich in Computer.java in meiner printInformations Out.println(Name + IP ), schreibe das dann die übergebenden Werte ausgegeben werden. Ich habe das ja schon einmal mit einer get und set Methode gemacht, aber ich weiß nicht wie ich das hierdrauf anwenden soll.


----------



## kneitzel (26. Jan 2016)

Schau Dir doch einmal Konstruktoren an. Was Dir fehlt sind die entsprechenden Konstruktoren, die die Werte, die da übergeben wurden, abspeichern.


----------



## David2456 (26. Jan 2016)

Jetzt habe ich ein Konstruktor welcher die Werte speichert. Jetzt kriege ich aber die fehlermeldung das meine Klasse Computer nicht abtsrakt ist. Was muss ich hinzufügen? Noch ein Konstruktor in Computer oder die Variablen oder...?
Main.java wie oben


```
public abstract class CommunicationDevice {
        public String Name;
        public String IP;
      
        //void addContact();
      
        public CommunicationDevice(String N, String i){
            Name = N;
            IP = i;
        }

        public abstract void  printInformations(); 
                       
       // void receivedMessage();
        //void sendMessage();
        //void broadcast(); 
}
```


```
public  class Computer extends CommunicationDevice {
        //void addContact();

         void printInformations(String Name, String IP){
            Out.println(Name + IP);
         }
       
        //void receivedMessage();
        //void sendMessage();
        //void broadcast();
}
```


----------



## kneitzel (26. Jan 2016)

Du brauchst auch einen entsprechenden Konstruktor in Computer. Du willst doch new Computer(Arguments) machen ... also reicht der Standard Konstruktor nicht.


----------



## David2456 (27. Jan 2016)

Danke dir. printInformations funktioniert jetzt. Mein nächstes Problem wäre die addContact Methode. Soll ich dazu die Kontakte in einem Array speichern? Wenn ja wie? Zudem kann mir einer den Fehler hierbei erklären? method in addContact can not be applied to given types: actuel and former lists differ length (ich weiß in der Methode steht nichts, aber sollte nicht trotzdem der Fehler ausgegeben werden sondern ein andere z.B missing body type?)


```
//Main
public class Main {

    public static void main(String[] args) {
    // Has to be a syntax error:
    // CommunicationDevice c = new CommunicationDevice("c");

    CommunicationDevice compA = new Computer("Comp A", "0.0.0.1");
    CommunicationDevice compB = new Computer("Comp B", "0.0.0.2");
    CommunicationDevice phoneA = new SmartPhone("SmartPhone A");
    CommunicationDevice phoneB = new SmartPhone("SmartPhone B");
    CommunicationDevice faxA = new Fax("Fax A", "1234");
    CommunicationDevice faxB = new Fax("Fax B", "5678");
   
    compA.addContact(phoneA);
    compA.addContact(faxA);
   
    Out.println("//generated by printInformations()-calls:");
    compA.printInformations();
    compB.printInformations();
    phoneA.printInformations();
    phoneB.printInformations();
    faxA.printInformations();
    faxB.printInformations();
   
   /* Out.println();
    Out.println("//generated by compA.receiveMessage(compB):");
    compA.receiveMessage(compB);
    Out.println();
   
    Out.println("//generated by compB.sendMessage(compA):");
    compB.sendMessage(compA);
    Out.println("//generated by phoneB.sendMessage(faxB):");
    phoneB.sendMessage(faxB);
    Out.println("//generated by phoneB.sendMessage(compB):");
    phoneB.sendMessage(compB);
    Out.println("//generated by faxB.sendMessage(compB):");
    faxB.sendMessage(compB);

    Out.println("//generated by compA.broadcast():");
    compA.broadcast();
    */
    }
   
}
```


```
//CommunicationDevice
public abstract class CommunicationDevice {

        public String Name;
        public String IP;
       
         public CommunicationDevice(){
           
        }
       
       
       
        public abstract void addContact();
       
      
       
        public abstract void printInformations();
           
       
                        
        //public abstract void receivedMessage();
        //public abstract void sendMessage();
        //public abstract void broadcast();
       
       
}
```


```
//Computer
public class Computer extends CommunicationDevice {

      
  
        public Computer(String N, String i){
            Name = N;
            IP = i;
        }
        
         public void addContact(){

           
        }
        
         public void printInformations(){
            Out.println(Name + " (" + IP + ")");         
         }
        
        //public void receivedMessage();
        //public void sendMessage();
        //public void broadcast();
       
       
}
```


```
//SmartPhone
public class SmartPhone extends CommunicationDevice {

       
       

        //public void addContact();
       
         public SmartPhone(String N){
            Name = N;          
        }
       
        public void printInformations(){
            Out.println(Name);         
         }
       //public void receivedMessage();
       //public void sendMessage();
       //public void broadcast();
}
```


```
//Fax
public class Fax extends CommunicationDevice {
       
       
        public Fax(String N, String i){
            Name = N;
            IP = i;
        }

       
       //public void addContact();
      
        public void printInformations(){
            Out.println(Name + ", number = " + IP);         
         }
       //public void receivedMessage();
       //public void sendMessage();
       //public void broadcast();
}
```


----------



## Joose (27. Jan 2016)

David2456 hat gesagt.:


> Mein nächstes Problem wäre die addContact Methode. Soll ich dazu die Kontakte in einem Array speichern? Wenn ja wie?



Ja ein Array oder eine Liste bieten sich hier an.
Hast du noch nicht mit Arrays gearbeitet? -> http://www.java-tutorial.org/arrays.html



David2456 hat gesagt.:


> Zudem kann mir einer den Fehler hierbei erklären? method in addContact can not be applied to given types: actuel and former lists differ length (ich weiß in der Methode steht nichts, aber sollte nicht trotzdem der Fehler ausgegeben werden sondern ein andere z.B missing body type?)



Deine Methode "addContact" hat keine Parameter, du gibst aber beim Aufruf dieser Methode einen Parameter mit. Du solltest daher die Deklaration der Methode überdenken und einen Parameter hinzufügen.


----------

