# Vervollständigen sie das folgende Programm...



## Didilicious (19. Mrz 2021)

Hallo alle zusammen!
Ich bin echt am verzweifeln, ich soll ein Programm vervollständigen verstehe aber absolut nicht wie ich da hin kommen soll :/
Ich hoffe das das mir hier vlt geholfen werden kann. Vielen dank schonmal an alle die sich hier einbringen!


```
public class Extend {
        public static void testA(A [] a) {
        for(A x :a)
            x.doit();
           
           
    }
    public static void testB(B [] b) {
        for(B x : b);
        System.out.println(x.makeIt());
           
    }

    public static void main (String[]args) {
        A[] a = {new A(),new c(34),new A(12)};
        testA(a);
        testB(a);
    }
}
```

Die Ausgabe soll folgendermaßen aussehen:
A17
A34
A12
1
2
3


----------



## fhoffmann (19. Mrz 2021)

Du hast drei Klassen: A, B und C.
Diese erben irgendwie voneinander.
Überlege dir doch erst einmal, wie diese Vererbung aussehen muss, damit der obige Code kompiliert werden kann.


----------



## Didilicious (19. Mrz 2021)

Ist denn das "A" im Array das selbe A wie im elementbezeichner der foreach schleife?
Ich tue mich gerade wahnsinnig schwer, was da für eine logik hintersteckt.
In der Array Initialisierung werden Objekte der Klassen A und B erzeugt, die in das Array a geschrieben werden, das vom Typ A ist oder ist das einfach nur um zu verwirren?


----------



## kneitzel (19. Mrz 2021)

Also da ist nichts um dich zu verwirren. Und A, B und C meinen da alle die jeweilige Klasse.

Und du musst aufpassen: In das Array vom Typ A[] kommen nur Instanzen von Typ A und C. Nicht von Typ B.

Aber die Variable vom Typ A[] wird an eine Methode gegeben, welche ein Array vom Typ B erwartet.


----------



## Didilicious (19. Mrz 2021)

Okay das hilft mir schon mal weiter, das A,B und C immer die jeweilige klasse meinen.
Ich probiere jetzt nochmal ein wenig rum danke schonmal!


----------



## Didilicious (19. Mrz 2021)

Also C muss von A erben, da es in ein Array vom Typ A geschrieben werden soll. Außerdem brauche ich einen Konstruktor, der einen Int wert erwartet und einen der nichts erwartet: new A (), und new A(12).
Ich glaube ich werde noch verrücktr bei dieser Aufgabe


----------



## kneitzel (19. Mrz 2021)

Das ist doch schon ein Anfang ....

was lässt sich denn jetzt schon übersetzen und wo hakt es noch?


----------



## Didilicious (19. Mrz 2021)

in der main Methode bekomme ich jetzt keine fehler mehr, er sagt mir allerdings das klasse A bereits definiert ist


```
class A{
    
    public A(int i) {
    }
    
    public A() {
    }

}

class C extends A{

    public C(int i) {
    }
    
    
}
```


----------



## kneitzel (19. Mrz 2021)

Dann wäre die Frage, was Du da genau an Code hast. Hast Du ggf. noch mehr Dateien in deinem Projekt? Die Klasse Extends, die Du uns gezeigt hast, definiert noch keine Klasse A.

Ansonsten würde ich noch erwarten, dass Du noch ein Fehler bekommen musst, denn die Klasse B hast Du noch nicht (zumindest nicht uns gezeigt).


----------



## Didilicious (19. Mrz 2021)

Du hast natürlich recht. Bei testB bekomme ich einen Fehler weil ein Array vom Typ A übergeben bekommt und eines vom Typ B erwartet. Das Problem mit Class A hat sich erledigt. So sieht der gesamte Code aus:


```
class A{   
    public A(int i) {
            
    }
        
    public A() {
            
    }

}

class C extends A{

    public C(int i) {
    }
        
        
}
class B{

}

    public class Extend {
            public static void testA(A [] a) {
            for(A x :a)
                x.doit();
                
                
        }
        public static void testB(B[] a) {
            for(B x : a);
            System.out.println(x.makeIt());
                
        }

        public static void main (String[]args) {
            A[] a = {new A(),new C(34),new A(12)};
            testA(a);
            testB(a);
        }
    }
```


----------



## fhoffmann (19. Mrz 2021)

Wenn du ein A[] übergibst, wo ein B[] erwartet wird (in testB), muss ein A ein B sein, sprich davon erben.


----------



## Didilicious (19. Mrz 2021)

Ich habe B schon von A erben lassen. das löst den Fehler leider nicht. er sagt dann weiterhin das B[] nicht das selbe ist wie A[]


----------



## fhoffmann (19. Mrz 2021)

Didilicious hat gesagt.:


> Ich habe B schon von A erben lassen.


Du sollst auc A von B erben lassen! Verstehst du auch, warum?


----------



## Didilicious (19. Mrz 2021)

Ja weil ja die Klasse testB mit dem array vom Typ A füttern möchte und dort ein Array vom typ A erwartet wird. deswegen muss B die eigenschaften von A erben oder? Jetzt ist das Ganze bis auf die Methoden "doit" und "makeit" fehlerfrei.


----------



## Didilicious (19. Mrz 2021)

nicht vom Typ A erwartet sondern von B*


----------



## Didilicious (20. Mrz 2021)

So die Ausgabe habe ich jetzt geschafft. ich glaube allerdings, dass die Ausgabe 1,2,3 etwas geschummelt ist xD

```
class A extends B{

    public A(int i) {
        Zahl2=3;
        Zahl = i;
        Buchstabe = "A";
        System.out.println("Konstruktor von A");
        }
        
    public A() {
        Zahl2=1;
        Zahl =17;
        Buchstabe="A";
            
    }

    public void doit() {
        System.out.println(Buchstabe+Zahl);
        
        
    }

    }

class C extends A{

    public C(int i) {
        Zahl2=2;
        Zahl =i;
        Buchstabe = "A";
        System.out.println("Konstruktor von C");
    }
}

class B{
    public  int Zahl;
    public static String Buchstabe;
    public int Zahl2;
    public int  makeIt() {
        
        return Zahl2;
        
    }

    }


    public class Extend {
            public static void testA(A [] a) {
            for(A x :a) {
                x.doit();
                
            }
                
        }
        public static void testB(B[] a) {
            for(B x : a) {
                System.out.println(x.makeIt());
            }
                
        }

        public static void main (String[]args) {
            A[] a = {new A(),new C(34),new A(12)};
            testA(a);
            testB(a);
        }

    }
```


----------



## mihe7 (20. Mrz 2021)

Didilicious hat gesagt.:


> ich glaube allerdings, dass die Ausgabe 1,2,3 etwas geschummelt ist xD


Du könntest in B auch einfach einen statisch deklarierten Zähler hochzählen.


----------



## Didilicious (20. Mrz 2021)

mihe7 hat gesagt.:


> Du könntest in B auch einfach einen statisch deklarierten Zähler hochzählen.


Jo das stimmt. Aber ansonsten passt ja alles. Vielen Dank an alle die geholfen haben!


----------

