Interface > Abstract > Class

testy

Mitglied
Hallo Zusammen,

ich habe mich soeben in diesem Forum angemeldet. Ich bin Programmierer und (hauptsächlich .Net) und muss hin und wieder Java SE/EE coden.

Ich suche eine Lösung (sicher nur eine Syntaxfrage) für folgendes Vererbungsproblem.
Java:
public interface CarProperty{
}

public interface Car{
   CarProperty getProperty();
   void setProperty( CarProperty value );
}

public abstract class AbstractCar<TProperty extends CarProperty> implements Car {
   public CarProperty getProperty();    //this is ok
   public void setProperty( TProperty value );  //this is not ok

}

Welche Syntax muss ich anwenden um die setProperty mit generics als auch die setProperty des interfaces Car zu bedienen?

Gruß,
testy
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
du könntest es so lösen:
Java:
public interface CarProperty {
}

public interface Car<T extends CarProperty> {
	T getProperty();
	void setProperty(T value);
}

public abstract class AbstractCar<T extends CarProperty> implements Car<T>
{
	@Override
	public void setProperty(T value) {
		
	}
}
 

testy

Mitglied
wow, das ging schnell.
Ja, das ist eine Lösung. Jedoch möchte ich die die Car-Klassen so verwenden.

Java:
public class FastCarProperty implements CarProperty{
}

public class FastCar extends AbtractCar<FastCarProperty>{ 
  ...
}

CarProperty x = myFastCarPropertyInstance;

//Fall 1:
Car interfaceCar = myFastCar;
interfaceCar.setProperty( x );

//Fall 2:
AbstractCar absCar = (AbstractCar<FastCarProperty>)myFastCar;
absCar.setProperty( (FastCarProperty)x );

//usw.



Wichtig ist, dass Fall 1 ohne die Angabe von generics funktioniert. Von der Vererbung her sollte also folgender Aufbau möglich sein:

Interface > GenericInterface > AbstractClass > Class

wobei jede auf der/dem vorhergehenden Klasse/Interface aufbaut.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das heißt dass jedes Car (auch jedes Spezielle, z.B. FastCar) mit dem Allgemeineren Interface zurechtkommen muss? Das wäre dann
Java:
public abstract class AbstractCar /*<TProperty extends CarProperty>*/ implements Car {
   public CarProperty getProperty();    //this is ok
   /*public void setProperty( TProperty value );  //this is not ok*/
}
Aber vermutlich nicht das, was du willst!?
 

testy

Mitglied
Genau, außer, dass ich mit meinen KOmmentaren etwas uneindeutig war.

"this is not ok" bedeutet, der Compiler will es nicht
"this is ok" bedeutet, der Compiler nimmt es an

das heißt:
- im Interface muss es
Code:
setProperty( CarProperty value )
geben
- im darauf aufbauenden generischen Interface/Abstract Class muss es
Code:
setProperty( TProperty value )
geben
- in der darauf aufbauenden speziellen Klasse muss es
Code:
setProperty( FastCarProperty value )
geben

Vielleicht ist dies ja auch gar nicht möglich. In .Net geht sowas. Vielleicht als Beispiel wie die Klasse in C# aussehen würde:

Code:
public interface Car{
   CarProperty getProperty();
   void setProperty( CarProperty value );
}

public abstract class Car<TProperty> where TProperty:CarProperty{
   TProperty getProperty();
   void setProperty( TProperty value );
}

public class FastCar : Car<FastCarProperty>, Car {

    CarProperty Car.getProperty(){...}
    void Car.setProperty( CarProperty value ) {...}

    public FastCarProperty getProperty(){...}
    public void setProperty(FastCarProperty value){...}

}

Der Unterschied ist, dass ich den Member vom einfachen Interface Car "ausblenden" kann. Würde ich die FastCarKlasse explizit nach Car casten würde ich dann die "ausgeblendete" Property nutzen.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Halte ich für einen Designfehler. Denn dann könntest du mit einem cast auf Car jede beliebige Property zuweisen. Mit meiner Methode hättest du wenigstens noch einen lesenden Zugriff. Was vllt ausreichen könnte:

Java:
Car<?> myCar = new FastCar();
CarProperty prop = myCar.getProperty();
// ... do something with prop
if(myCar instanceof FastCar) {
	FastCar myFastCar = (FastCar) myCar;
	// ... do something with myFastCar
}

edit Ach ja und btw:
Java™ Quelltext ist bitte in [ JAVA]-Tags zu schreiben: [ JAVA]hier Java Code einfügen[ /JAVA]
 

testy

Mitglied
Tomate_Salat: meine Mitteilungen hatte ich vor Deinem Post bereits entsprechend formatiert (JAVA). Mein zuvor erstellter Beitrag zeigt keinen JavaCode sondern C# - deshalb auch nicht JavaCode.

Eine beliebige Property kann ich NICHT zuweisen, denn es wird immer die nach außen sichtbare Variante genommen. Weiterhin ist das in .Net möglich. Und als Design-Fehler würde ich es nicht gleich bezeichnen.

Nichts desto trotz nehm ich einfach Deinen letzten Vorschlag (auf das mit dem
Code:
Car<?>
war ich nicht gekommen). Der ist am nächsten an der Lösung und mit dem kann ich auch erstmal gut leben. Ich vermute auch inzwischen, dass das was ich möchte bei Java nicht geht. Mir fehlt leider der Fachbegriff für dieses Ableitungskonstrukt. Hat jemand eine Idee?

Ich danke euch für all die Vorschläge! Das ging vor allem ziemlich fix, super!
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
@testy: hab deinen vorherigen Beitrag nicht im Kopf, aber kann sein, dass dein Beitrag einfach länger auf war und ich die Änderung nicht mitbekommen habe, letztendlich auch egal, ich denke es geht um eine Java-Lösung ;-). Ich weis nicht wie das in .NET ausschaut (werde ich aber mal testen^^)
 

Landei

Top Contributor
Normalerweise hat man sowas:

Java:
public interface CarProperty {
}

class TProperty implements CarProperty {
}
 
public interface Car<T extends CarProperty> {
    T getProperty();
    void setProperty(T value);
}

public abstract class AbstractCar implements Car<TProperty>
{
    @Override
    public void setProperty(TProperty value) {
        
    }
}
 

testy

Mitglied
Landei: das ist ein schöner Trick, den Generic TProperty einfach als Klasse zu definieren ;) ... es ist auch schwierig zu erklären was ich will. Unten ist der Code, wie ich ihn hätte gern gehabt.

Tomate_Salat: Zur Vollständigkeit fürs ausprobieren der C# Code

Code:
    class Program {
        static void Main( string[] args ) {

            FastCar fastCar = new FastCar();
            Car iCar = fastCar;

            FastCarProperty fastCarProp1 = fastCar.getProperty();
            CarProperty fastCarProp2 = fastCar.getProperty();

            CarProperty carProp1 = iCar.getProperty();
            iCar.setProperty( fastCarProp1 );


        }
    }

    
    public class CarProperty {}

    

    public interface Car {

        CarProperty getProperty();
        void setProperty( CarProperty value );

    }

    public interface Car<TProperty> where TProperty : CarProperty {
        TProperty getProperty();
        void setProperty( TProperty value );
    }

    public abstract class AbstractCar<TProperty> : Car<TProperty>, Car
        where TProperty : CarProperty {

        TProperty _property;

        #region Car implementation
        
        CarProperty Car.getProperty() { return _property; }
        void Car.setProperty( CarProperty value ) { _property=(TProperty)value; }

        #endregion


        #region Car<> implementation
        
        public TProperty getProperty() { return _property; }
        public void setProperty( TProperty value ) { _property=value; }

        #endregion

    }

    public class FastCarProperty : CarProperty { }
    public class FastCar : AbstractCar<FastCarProperty> {}

Also der springende Punkt ist, dass ich das Interface benutzen möchte, ohne Car<?> anzugeben. Aber inzwischen nehme ich erstmal Car<?>.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Könnte so deine Lösung ausschauen (unter Verwendung von Landei's vorschlag):
Java:
public class Demo
{
	public static void main(String[] args)
	{
		AbstractCar car = new FastCar(); // oder Car<TProperty> car = new FastCar();
		car.setProperty(new FastCarProperty());
	}
}

public interface CarProperty {}
public class TProperty implements CarProperty {}

public interface Car<T extends CarProperty> {
	T getProperty();
	void setProperty(T value);
}

public abstract class AbstractCar implements Car<TProperty>
{
	@Override
	public void setProperty(TProperty value) {
		
	}
	
	@Override
	public TProperty getProperty() {
		return null;
	}
}

public class FastCar extends AbstractCar {}
public class FastCarProperty extends TProperty {}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
T abstract - interface Unterschied Allgemeine Java-Themen 22
S static mit abstract und in interface Allgemeine Java-Themen 10
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
OnDemand Interface imlementieren Allgemeine Java-Themen 4
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
K Interface Interface comparable machen Allgemeine Java-Themen 9
N Trick für Compilerfehler bei fehlendem Interface Allgemeine Java-Themen 12
X Interface - Klasse einladen Allgemeine Java-Themen 6
G Interface -> InterfaceImplementierung Allgemeine Java-Themen 3
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
R Interface instanzieren Allgemeine Java-Themen 8
B Frage zu Interface und List Allgemeine Java-Themen 4
KrokoDiehl JNI: native im Interface Allgemeine Java-Themen 4
S normale vererbung als interface Allgemeine Java-Themen 2
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
S interface verbung problem Allgemeine Java-Themen 9
S problem programm mit interface: Allgemeine Java-Themen 3
B Interface und von Thread ableiten Allgemeine Java-Themen 6
R Interface Serializable technische Begrenzung Allgemeine Java-Themen 2
T Interface-Referenz Allgemeine Java-Themen 2
L interface abstrakte klasse Allgemeine Java-Themen 21
S Interface Geschäftslokik & GUI Allgemeine Java-Themen 6
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
C Schnittstellen(interface) Allgemeine Java-Themen 9
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
D javadoc interface + implementation + @overrides Allgemeine Java-Themen 16
G Interface oder abstrakte Klasse Allgemeine Java-Themen 4
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
G class, interface, or enum exp? Allgemeine Java-Themen 2
S Interface Klasse überladen. Allgemeine Java-Themen 2
K Inneres Interface äußere Klasse Allgemeine Java-Themen 7
T Frage zu interface und "guter Programmierstil" Allgemeine Java-Themen 4
T Interface "on-the-fly" implementieren? Allgemeine Java-Themen 3
S Frage zu Interface Allgemeine Java-Themen 7
J Objektorientiert - Interface & Klassen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
T "Programming against the interface" sinnvoll? Allgemeine Java-Themen 18
G Interface mehrfach implementieren Allgemeine Java-Themen 5
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
A Was ist der genau Sinn eines Interface? Allgemeine Java-Themen 13
E Oberbergriff für class und interface Allgemeine Java-Themen 20
D QuickSort, Interface Allgemeine Java-Themen 2
R Interface für Arithmethik? Allgemeine Java-Themen 3
MQue Interface implementieren Allgemeine Java-Themen 7
P Liste von Klassen die ein Interface implementieren speichern Allgemeine Java-Themen 12
L Interface Frage! Allgemeine Java-Themen 25
T Instanz einer Interface abgeleiteten Klasse erzeugen Allgemeine Java-Themen 3
F Ein interface und private Methoden? Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben