Interface Interface vs. Abtract

snooc

Mitglied
Hey Leute, ich habe nun schon seit ein paar Tagen ein Problem mich für
ein bestimmtes Design für eine kleine Hobby-Unternehmung zu entscheiden.
Ich hoffe wirklich, dass mir hier jemand helfen kann..

Einleitung:
Ich möchte ein Framework in Java schreiben welches HTML abkapselt
und bei Anwendung HTML5-validen Code erzeugt.

Überlegung:
HTML-Tags sind eigene Objekte und deren Attribute (z.B.: <img src=".." alt="..">
ebenso. Da verschiedene HTML-Elemente auch verschiedene Attribute haben
stellt sich die Frage, wie man das am vernünftigsten anstellt, sodass man nicht
irgendwelche Dinge doppelt oder dreifach implementiert. Ein HTML-Element muss
über seine Attribute bescheid wissen, da diese manchmal auch
abhängig voneinander sind. In C++ würde ich die jew. Attribute
an das jew. HTML-Element durch Mehrfachvererbung weitergeben z.B.:

Code:
class img : public srcAttribute, public altAttribute {
  // ...
}

In Java geht das nicht.
Nun steht ich vor dem Problem (seit Tagen) wie ich das am vernünftisten machen kann.
Aber egal wie ich es drehe und wende, ich komme auf mehrfache Implementationen oder
auf abstruse Konstrukte die man in C++ evtl. vermeiden könnte.

Die Frage lautet also:

Wie würdet ihr das angehen? Die HTML-Elemente müssen ihre Attribute
selber verwalten. Manche Attribute sind von anderen wiederum
abhängig usw. Mir fällt kein gutes Design ein.

Und hier noch eine fundamentale Frage:
Auf Wikipedia gibts ein Beispiel zum Strategy-Pattern.
Würde man die klasse

Java:
interface Strategy {
    int execute(int a, int b); 
}
auf
Java:
public abstract class Strategy {
    abstract int execute(int a, int b); 
}

Dürfte das doch zum selben Ergebnis führen oder?

Ich hoffe mir kann jemand bei diesen Fragen helfen. Im wesentlichen geht es
darum dass ich den Vorteil nicht erkenne den mir ein
Code:
interface
wohl
bieten soll bzw. ich wohl etwas zu sehr an der Mehrfachvererbung hänge.

Vielen Dank für jede Form der Hilfe!
 

Volvagia

Top Contributor
Jeder Tag hat ja bloß einen Namen und einen Wert. Würde da eine einfache Instanz nicht ausreichen, die beides speichert? Oder eine HashMap, der Tag hat diesen Wert. Wobei sie dann aber pro Element nur 1 mal vorkommen dürften.

Ein Interface ist in der Anwendung eine abstrakte Klasse, die ausschließlich abstrakte Methoden und Konstanten beinhaltet, damit noch von etwas anderen geerbt werden kann. Also ja, vom weitem betrachtet ist es genau das Selbe, nur wenn die Klasse verwendet wird kann von keiner anderen Klasse mehr geerbt werden.
 
Zuletzt bearbeitet:

Kevin94

Top Contributor
Ich denke du machst dein konzept schwieriger als nötig.
Bei dem C++ beispiel dreht es mir den Magen um: ein img-Tag ist weder ein srcAttribut noch ein altAttribut.Wenn dann mit interfaces: HasSrcAttribute und HasAltAttribut

Muss jeder Tagtyp und jedes Attribut eine eigene Klasse oder reicht eine Klasse Tag und eine Klasse Attribut.

Ich würde folgendes vorschlagen:
Java:
public enum TagType
{
    img,a,h1,...;

    AttributeType[] expectedAttributes,optionalAttributes;
}

public enum AttributeType
{
    src,alt,href,...;
}

public class Tag
{
    TagType tagType;
    Vector<Attribute> attribute;

}

public class Attribute
{
    AtributeType attrType;
}
 

Empire Phoenix

Top Contributor
Ich bi nciht ganz sicher, will der O html code validiren doer neuen erstellen? Beim erstellen würde ja nen J2EE gehen im xhtml modus, da das regilär ist und einfach überprüft werden kann kann man bei entsprechner einstellung sicherstellend as nur valider code produziert wird.
 

snooc

Mitglied
Hallo Leute,

erstmal danke für eure Antworten.
Also ich schildere mal das Design für welches ich mich entschieden habe:

Eine Basisklasse
Code:
Attribute
bietet grundlegende Funktionalitäten die dann
auf SinglevalueAttribute (z.B. href) und MultivalueAttribute (z.B. class) abgeleitet
wird. Diese beiden kann man dann zum Beispiel als Basisklasse für das eben genannte
class-Attribute verwenden.

Ein HTML-Tag hat eine Basisklasse
Code:
HtmlObject
. Diese Klasse bietet ebenfalls
Grundfunktionalitäten für den HTML-Tag (z.B. einen Container für dessen konkrete Attribute.
Diese Attribute werden nun in solch einer Klasse wie folgt hinzugefügt:

Java:
package html.blocklevel.textcontainer;

import html.attributes.elements.ColsAttribute;
import html.attributes.elements.DisabledAttribute;
import html.attributes.elements.LanguageAttribute;
import html.attributes.elements.NameAttribute;
import html.attributes.elements.PlaceholderAttribute;
import html.attributes.elements.ReadonlyAttribute;
import html.attributes.elements.RowsAttribute;
import html.attributes.elements.TitleAttribute;
import html.blocklevel.base.BlocklevelTextcontainer;

public class Textarea  extends BlocklevelTextcontainer {
	
	
	public ColsAttribute _cols					= new ColsAttribute();
	public RowsAttribute _rows 					= new RowsAttribute();
	public DisabledAttribute _disabled 			= new DisabledAttribute();
	public NameAttribute _name					= new NameAttribute();
	public ReadonlyAttribute _readonly			= new ReadonlyAttribute();
	public LanguageAttribute _lang				= new LanguageAttribute();
	public TitleAttribute _title				= new TitleAttribute();
	public PlaceholderAttribute _placeholder	= new PlaceholderAttribute();

	
	public Textarea() {
		
		super("textarea");
		addMyAttributes();
	}

	@Override
	protected void addMyAttributes() {
		
		super.addHtmlObjectSpecificAttribute(_cols);
		super.addHtmlObjectSpecificAttribute(_rows);
		super.addHtmlObjectSpecificAttribute(_disabled);
		super.addHtmlObjectSpecificAttribute(_name);
		super.addHtmlObjectSpecificAttribute(_readonly);
		super.addHtmlObjectSpecificAttribute(_lang);
		super.addHtmlObjectSpecificAttribute(_title);
		super.addHtmlObjectSpecificAttribute(_placeholder);
	}
	
} // End of class Textarea

Java:
public abstract class HtmlObject {

    protected		Vector<Attribute> 	m_attributes_container 	= new Vector<Attribute>();

    // ...

	protected void addHtmlObjectSpecificAttribute(Attribute attribute) {
		
		if(attribute != null) {
			m_attributes_container.add(attribute);
		}
	}
    // ...
} // End of class HtmlObject

Das was mir hier nun nicht gefällt ist die Anwendung, denn ich kann
die Attribute dann nur über den Zugriff auf eine public-Variable manipulieren.
 

bERt0r

Top Contributor
Verstehe das Problem nicht, schreib dir doch eine get Methode... Wie soll denn deine Anwendung in deinen Wunschträumen funktionieren?
 

snooc

Mitglied
Dann muss ich für jedes HTML-Element die Getter und Setter schreiben, und das obwohl die Attribute bereits diese Funktionen besitzen. Und genau diese Mehrfachimplementierung würde ich gerne verhindern.

Die Underlines sind für mich immer das Kennzeichen einer public-Membervariable ^^
 

Volvagia

Top Contributor
Wenn ich das richtig verstanden habe (der Satz sollte vielleicht in meine Signatur), dann wäre das Element eine Fasade dafür. Finde ich persönlich schöner, ich baue gerne Subsysteme auf und greife über eine Klasse als Schnittstelle darauf zu.
Aber theoretisch könntest du dir einfach die Attribute im äußeren Programmteil über einen Getter am Element hohlen und direkt darauf zugreifen. Allerdings könnte es dabei nötig sein, dass das Element sich per Listener über Änderungen informieren lässt, je nach dem wie du es designt hast.
 

snooc

Mitglied
Also wäre das gar nicht so "hässlich" wenn ich das so mache?

Also ein Attribut kann zum beispiel so aussehen:

Java:
public class ClassAttribute extends MultiValueAttribute {

	private final static String m_attribute_name = "class";
	
	public ClassAttribute() {
		super(m_attribute_name);
	}
	
	public void addClass(String class_name) {

		addValue(class_name);
	}
	
	
	public boolean removeClass(String class_name) {
		
		if( removeValue(class_name) == null )
			return false;
		else 
			return true;
	}
	
	public boolean containsClass(String class_name) {
		
		return containsValue(class_name);
	}
}

Und irgendein Html-Objekt könnte dieses nun beinhalten. Das würde dann so aussehen
(wenn ich das Attribut private verwenden will und nur über Getter und Setter Zugriff zulasse).

Java:
public abstract class HtmlElement extends HtmlObject {
	
	
	protected AccesskeyAttribute m_accesskey 				= null;
	protected ClassAttribute m_class 						= null;
	protected ContenteditableAttribute m_contenteditable 	= null;
	protected ContextmenuAttribute m_contextmenu			= null;
	
	protected HtmlElement(String html_tag_name, int categorie, int content_model) {
		
		super(html_tag_name, categorie, content_model);
	}
	
	public void addClass(String class_name) {
		m_class.addClass(class_name);
	}
	
	public void removeClass(String class_name) {
		m_class.removeClass(class_name);
	}
	
} // End of class HtmlObjectWithStandardAttributes
 

bERt0r

Top Contributor
Hast du da nicht mehr arbeit, wenn du für jedes Attribut wieder eigene add und remove Funktionen schreiben musst?
Eine Alternative wäre Volvagias Vorschalg, eine enum deiner Attributetypen zu Erstellen und eine Map<Attributtyp,Attribut> für deine HTML Objekte zu machen.
 

snooc

Mitglied
Ein enum allein würde nicht ausreichen. Die Attribute dürfen nur bestimmte Werte zugewiesen
bekommen. Darum habe ich eine abstrakte klasse Attribut, die abgeleitet wird und dann je nach
Attribut was anderes annehmen darf.
Code:
<table border="hallo">
wäre z.B. nicht HTML5 konform.

Beispiel:
Java:
package html.attributes.elements;

import html.attributes.base.SingleValueAttribute;
import html.attributes.values.RelValue;
import html.exceptions.attributes.InvalidValueException;

public class RelAttribute extends SingleValueAttribute  {
	
	private final static String m_attribute_name = "rel";

	public RelAttribute() {
		
		super(m_attribute_name);
	}
	

	/**
	 * setRel
	 * 
	 * @param value_code
	 * Valid codes can be found in 
	 * html.attributes.values.RelValues
	 * @throws InvalidValueException 
	 */
	public void setRel(RelValue rel_value) throws InvalidValueException {
		
		switch(rel_value)
		{
		case ALTERNATE:
			super.setValue("alternate");
			break;
			
		case AUTHOR:
			super.setValue("author");
			break;
			
		case HELP:
			super.setValue("help");
			break;
			
		case ICON:
			super.setValue("icon");
			break;
			
		case LICENCE:
			super.setValue("licence");
			break;
			
		case NEXT:
			super.setValue("next");
			break;
			
		case PINGBACK:
			super.setValue("pingback");
			break;
			
		case PREFETCH:
			super.setValue("prefetch");
			break;
			
		case PREV:
			super.setValue("prev");
			break;
			
		case SEARCH:
			super.setValue("search");
			break;
			
		case SIDEBAR:
			super.setValue("sidebar");
			break;
			
		case STYLESHEET:
			super.setValue("stylesheet");
			break;
			
		case TAG:
			super.setValue("tag");
			break;
			
			default:
				throw new InvalidValueException();
		}
		
	}

	
	/**
	 * getRel
	 * 
	 * The rel attribute specifies the relationship between 
	 * the current document and the linked document.
	 * Note: Browsers do not use this attribute in any way. 
	 * However, search engines can use this attribute to 
	 * get more information about a link.
	 * 
	 * @return
	 * The active rel-value
	 */
	public String getRel() {
		
		return super.getValue();
	}


} // End of class RelAttribute
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Ich sagte eine enum für deine Attributtypen. Z.b
enum AttributTyp { bgcolor, text, src, onclick}
Dadurch kannst du dann bequem und eindeutig auf die Attribute in der Map zugreifen.
z.b map.put(AttributTyp.bgcolor,new BGColorAttribute(Color.red));
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
G Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben