Vererbung - Anpassen von Feldtypen!?

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
hi,

ich glaub zu wissen, dass man das nicht wirklich machen sollte, aber ich habe folgendes "Problem":

Ich habe eine Klasse ContextFreeGrammar, welche eine kontextfreie (Typ2 der Chomsky-Hierarchie) Grammatik G darstellt (G = (SIGMA, M, R, S))

ich speicher mir in der Klasse folgendes ab:
********************************
  • List<String> für nicht-Terminalsymbole (M)
  • Hashtable<String,Liste<String>> (also zu jedem M eine Menge von erlaubten Ableitungen/Alternative)
  • Liste der Terminalsymbole, welche innerhalb der Alternativen auftreten (Elemente aus SIGMA*)
  • zusätzlich noch ein Startsymbol der Grammatik, sowie ein Marker, welche die Terminalsymbole umgibt, damit ich diese von nicht-Terminalsmbolen unterscheiden kann

[HIGHLIGHT="Java"]
public class ContextFreeGrammar {

private List<String> nonTerminals;

private List<String> terminals;

private Hashtable<String,List<String>> rules;

private String startSymbol;
private char terminalMarker;

[...]
[/HIGHLIGHT]

So dass ist als Grundgerüst schon ganz brauchbar, doch ich beziehe mich im weiteren Programmverlauf auf 2 verschiedene Notationen für Typ2-Grammatiken. Zum Einen die BNF-Notation (Backus-Naur-Form), welche ich aus externen Datein einlese die der Nutzer angeben kann; und zum Zweiten die CNF (Chomsky-Normal-Form), welche ich erhalte, wenn ich die BNF mit einem Algorithmus umwandel. Die CNF wird verwendet um die BNF-Grammatiken mit einem universellen Parser zu parsen, sodass ich jede Typ2-Grammatik mit ein und dem selben Parser parsen kann (erleichtert Erweiterbarkeit für neue Grammatiken). Die CNF hat nun einige Restriktionen was die Regelmenge der Grammatik angeht.

Man kann nur Regeln folgender Form angeben:

M => Terminalsymbol
M => NichtTerminalsymbol1 NichtTerminalsymbol2

Im Gegensatz zu BNF gibt es also keine Alternativen mehr pro Nicht-Terminalsymbol. Das bedeutet das auch meine Listen-Datenstrukturen als solche überflüssig werden und ich normale Strings verwenden könnte.

Die CNF wäre also eine spezielle Notation der kontextfreien Grammatiken. Und nun dachte ich, man könnte hier mit Vererbung arbeiten und die List-Strukturen mit Strings überdecken, aber das ist wohl "dirty-style" oder?!

Da ich später über CNF parsen möchte, wäre es vielleicht effektiver nicht 1-elementige Listen zu verwenden sondern auf Strings zuzugreifen.

Also wesentlicher Unterschied: BNF = Listen von Alternative ... CNF = 1 Alternative bestehen aus 1 String (1 Terminalsymbol oder 2 nicht-Terminalsymbole in Folge).

Wie lös ich das nun am dümmsten !? Am besten gar keine Oberklasse verwenden und 2 Klassen (ContextFreeGrammarBNF und ContextFreeGrammarCNF) erstellen?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Moin,

[...alptraum-fach gekürzt]
Am besten gar keine Oberklasse verwenden und 2 Klassen (ContextFreeGrammarBNF und ContextFreeGrammarCNF) erstellen?

wenn sich die Datenhaltung der beiden Strukturen so extrem unterscheidet, macht Vererbung keinen Sinn ... also zwei Klassen ... Du kannst ja dann jeder Klasse eine Methode mitgeben um in die andere Form übergehen zu können

hand, mogel
 

hdi

Top Contributor
Ich würde sagen 2 Klassen (ContextFreeBNF/CNF) und 1 Interface Grammar.
(falls es wenigstens 1 Gemeinsamkeit gibt, die dir irgendwo nützlich sein könnte)
 

diggaa1984

Top Contributor
ja hab ich auch grad so gelöst :D .. die einzige gemeinsamkeit, wären public methoden sowie die Nötigkeit eines Startsymbols und der Nötigkeit des Markers für Terminalsymbole :D

=> [HIGHLIGHT="Java"]
package grammar;

import java.util.List;


/**
*
*
*
* @author Digger
* @version 0.1
*/
public abstract class Grammar {

protected String startSymbol;
protected char terminalMarker;

/**
*
* @param startSymbol
* @param terminalMarker
*/
public Grammar(String startSymbol, char terminalMarker) {
this.startSymbol = startSymbol;
this.terminalMarker = terminalMarker;
}//contructor


public abstract void addRule(String m, String v);

public abstract void removeRule(String m, String v);

public abstract List<Object> getTerminals();

public abstract List<Object> getNonTerminals();
}//Grammar
[/HIGHLIGHT]

was ich mich grad aber Frage ... Bisher arbeite ich ja mit Strings als (Non-)Terminalsymbolen. Mal angenommen man könnte später eigenen Klasen dafür einführen, ist dann die gewählte Variante hier mit List<Object> sinnvoll!? Sicherlich muss ich dann beim Auslesen casten, ist aber eigenltich der gängige Weg in dem Fall oder?! Somit schreibe ich den vererbten Klassen nicht vor welche Basis sie für ihre Symbole verwenden.

Wenn ich bei nem ActionListener die Source casten geh ich ja auch implizit davon aus das mir das Framework bei ner Anbindung an JButton nicht nen JTextfield da reinsetzt :D
 
Zuletzt bearbeitet:

hdi

Top Contributor
2 Dinge:

1) hast du nicht (ganz) das gemacht, was ich meinte: abstrakte Klassen = nicht so gut wie Interfaces.
Im Moment egal, aber für später bietet ein Interface leichtere Änderungsmöglichkeiten.

2) Für dein Terminal-Zeugs hab ich eine Idee. Ich hatte davor eine andere (viel bessere)
Idee, konnte sie aber nich realisieren und weiss nicht ob das geht.
Hier würde ich einen Profi bitten, zu helfen (dazu unten mehr).
Erstmal die zweite Idee:

Mach eine List<TerminalObject>, und das ist ein Interface mit einer Methode :

public Object getTerminal();

Mach dir eine Implementierung namens "TerminalString", die das Interface
implementiert und bei der getTerminal einen String rerturned.

Zwar musst du dann noch immer nach String casten, allerdings kannst du jetzt eine
neue Implementierung machen "TerminalWhateverObject", die ein WhatEverObject
bei der getTerminal() returned.

per instanceof kannste prüfen welche Implementierung das ist und entsprechend casten.
ISt kaum besser, aber vllt doch ein wenig leichter abzuändern, und vorallem wieder zurück
zu ändern im Nachhinein.
Aber zugegeben: Nich der Brüller,ich weiss! Also kannst es auch eher nich machen ;)

So, und meine Frage an die Profis:
Eig. wollte ich ihm folgendes vorschlagen:

Eine List<TerminalObject>, das ein Interface ist:

[HIGHLIGHT="Java"]interface TerminalObject<T>{
public <T> getTerminal();
}
[/HIGHLIGHT]

und einzelne Implementierungen könnten jetzt sagen: Es is ein String, oder ein ObjectWhatever usw.
Damit würden jegliche Überprüfungen an der Stelle, wo getTerminal() aufgerufen werden,
wegfallen, weil immer das richtige zurückkommt, und man könnte sich eben ohne Änderungen
neue Implementierungen zusammenschreiben.

Hoffe ist klar, was ich meine?!

Auf jeden Fall geht das so nicht, aber mit Generics und Wildcards etc kenn ich mich
leider noch nicht gut (sagen wir mal so: gar nicht!) aus.

Kann man diese Idee irgendwie verwirklichen??

edit: Hoffe das wird nich als Spam gesehen, aber dafür mach ich nen neuen Thread
auf mit passendem Titel!
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
hm also die Wahl der Implementierung würde ja gar nicht nach aussen hin möglich sein, das wäre nur eine Sache der abgeleiteten Grammatiken. Und da würde ich irgendwo schreiben welche Implementierung verwendet wurde, damit der Nutzer weiss, welchen Cast er ansetzen darf :D

Ich seh grad keinen grossen Vorteil, oder eine Änderung in der Flexibilität, wenn ich das Interface umsetze, da Terminals in dem Sinne keiner oberen Struktur zugeordnet werden (ausser implizit Object) müssen. Das einzige was da schieflaufen könnte wäre, dass die Grammatiken (ContextFreeGrammarBNF etc.) in eine List<Object> völlig inkonsistente Datentypen reinlegen dürfen. Aber da kommt mein Vergleich mit dem ActionListener, wo ich sage, dass ich als Nutzer auch davon ausgehe, das dort als Source die Komponente drin liegt an die ich den ActionListener binde und ich dementsprechen implizit weiss wohin ich casten muss.

Also ich appelieren an die Vernunft der Grammatiken auch nur einheitliche Datentypen in der Liste abzulegen. Im Moment appeliere ich da nur an meine Vernunft (Studienarbeit) :D .. aber wer weiss was die Uni mal mit dem Programm noch vorhat.

aso und zu 1. war ja die idee das ich zumindest identische Sachen in die Oberklassen auslagern kann, und da is mitm interface nich mehr viel :D
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben