# Wie Objekte einer Unterklasse erstellen?



## derweise (8. Jan 2010)

Hallo, wenn wir z.b. folgendes haben:

Superklasse:
1. Interface A
2. Class AImpl implements A

Unterklasse:
3. Interface ExtendedA extends A
3. Class ExtendedAImpl extends AImpl


1. Ist das überhaupt richtig so?
2. Wenn ich nun ein Objekt der erweiterung erstellen möchte, habe ich wie folgt gemacht:
A homeaddress = new ExtendedAImpl(//übergabe der paramater//);

ist das auch richtig?
denn wenn ich "homeaddress."  eintippe, gibt mir eclipse NUR die methoden der superklasse zur verfügung, die methoden der unterklasse tauchen unter den angebotenen nicht auf...?


----------



## derweise (8. Jan 2010)

keiner ne idee?^^


----------



## Der Müde Joe (8. Jan 2010)

naja...
A hat halt nur alles von A.
Wenn du auch die von ExtendA brauchst musst du das halt casten oder direkt benutzen
ExtendA blub = new ExtendAImpl...


----------



## Soulfly (8. Jan 2010)

Erstmal kannst du dir das Interface bei 3. sparen, das hat keinen Nutzen.

A homeaddress = new ExtendedAImpl(...);

Das erstellt ein neues Objekt ExtendedAImpl und speichert die Referenz zu diesem Objekt in einer Variablen vom Typ A, dem Interface von 1.. Es sind nur die Funktionen erreichbar, die es in diesem Typ gibt. Willst du alle Funktionen nutzen, müsste die Variable vom Typ ExtendedA sein. 

Cheers,


----------



## Der Müde Joe (8. Jan 2010)

>ExtendedAImpl wird nie mit ExtendedA deklariert,

Ohhh...da fehlt ja noch ein implements ExtendedA bei ExtendedAImpl


----------



## derweise (8. Jan 2010)

"ExtendA blub = new ExtendAImpl... "
geht nicht, er will dann ubedingt, dass gecastet wird. ist das normal?
"Type mismatch: cannot convert from ExtendedAddressImpl to ExtendedAddress"
nach dem casten ist dann alles ok...


----------



## Der Müde Joe (8. Jan 2010)

>geht nicht, er will

Ja hab übersehen, dass ExtendedA nicht impmementiert wird.
Müsste so sein:

```
interface AdIF {}
interface ExAdIF extends AdIF {}

class AdImpl implements AdIF{}
class ExAdImpl extends AdImpl implements ExAdIF{}
```

Der cast würde sonst nur eine ClassCastException provozieren zur Laufzeit.


----------



## derweise (8. Jan 2010)

hat sich erledigt...lag irgendwie an eclipse, dass er das nicht übernomme nhat


----------



## Der Müde Joe (8. Jan 2010)

klappt bei mir ohne Probleme:

```
interface AdIF {}
interface ExAdIF extends AdIF {}
 
class AdImpl implements AdIF{}
class ExAdImpl extends AdImpl implements ExAdIF{}

class Main {
	public static void main(String... _) {
		ExAdIF a = new ExAdImpl();
	}
}
```

EDIT:
>hat sich erledigt...lag irgendwie an eclipse, dass er das nicht übernomme nhat 

Ein F5 und Clean tut immer gut ;-)


----------



## sylo (5. Jul 2010)

Hi zusammen

hab in diesem Zusammenhang auch ein Frage. Folgende Situation:


```
public abstract interface A{}
public interface B extends A{}

class C {
	public C(A varA){
		B varB = (B)varA;
	}
}
```

Hier bekomme ich eine ClastCastException, komm aber leider nicht drauf warum.

Grüße
sylo


----------



## Niki (5. Jul 2010)

weil varA vermutlich nicht vom Typ B ist


----------



## SlaterB (5. Jul 2010)

weil a kein B sein muss

Beispiel:
A = Comparable 
B = Number extends Comparable

dann kann a auch ein String sein, und der Cast auf Number ginge schief


----------



## sylo (5. Jul 2010)

Number ist doch eine Klasse und Comparable ein Interface?

Ich werde mal etwas konkreter. Ich benutze das Interface Node. Nun möchte ich diesen erweitern und habe mein eigenes Interface geschrieben mit


```
public interface MyNode extends Node{
....
}
```

In einer anderen Klasse habe ich eine Methode die einen Node übergeben bekommt und diesen würde ich gerne zu MyNode casten. 

Irgendwie steh ich glaube ich auf dem Schlauch ???:L


----------



## SlaterB (5. Jul 2010)

stell dir nur vor, Number wäre ein Interface, und schon macht das Beispiel perfekt Sinn,
ist doch nicht schwer?

es bleibt dabei, ein Oberinterface/ -klasse ist was ganz anderes als das untere, egal ob mit ähnlichen Namen oder nicht

MyNode kann man immer auf Node casten, andersrum nicht, denn Node ist normalerweise kein MyNode, da hilft kein Cast


----------



## sylo (5. Jul 2010)

Ok. habs verstanden. 


> MyNode kann man immer auf Node casten, andersrum nicht, denn Node ist normalerweise kein MyNode, da hilft kein Cast



Der Satz war es. 

Danke dir.


----------

