Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hallo ich möchte zur laufzeit ein objekt einer klasse erstellen.
ich übergebe einer methode den klassennamen (inkl. pfad) einer existierenden klasse. ich weiss halt vorher nicht welche es ist. davon möchte ich gerne ein objekt erstellen damit ich die methoden des klassenobjektes nutzen kann.
Compilierfehler keine, gar keine fehler eigentlich =) ich kann halt nicht die funktionen der klasse DBAccess auf dem objekt meiner instanziierten klasse anwenden.
Das von dir instanziierte Objekt sollte von DBAccess geerbt haben, oder falls DBAccess ein Interface ist, sollte das Objekt dieses Interface implementiert haben. Nur dann kannst du erfolgreich nach DBAccess casten und die Methoden die DBAccess beschreibt nutzen.
ok sorry,
also in der klasse DBAccess habe ich verschiedene Methoden, wie z.B. insert(), oder executeQuery(). die möchte ich gerne nutzen. und auf das objekt der klasse anwenden.
ich bekomme dieser aber gar nicht erst zur verfügung gestellt. würde gerne sowas machen:
>> aber die aufrufe werden mir nicht angezeigt. das meine ich damit =)
Scheint eher was mit deiner IDE und der "autovervollständigung" zu tun haben ?!
Weil "werden mir nicht angezeigt" interessiert den Compiler erstmal nicht.
und falles es nicht an der IDE liegt:
die Variable newTableClass ist vom Typ DBAccess, du siehst genau die Methoden, die DBAccess zur Verfügung stellt,
wenn insert nicht dabei ist, dann fehlt diese Methode in DBAccess?
ok das passt schonmal, die funktionen der DBAccess werden vererbt. das geht jetzt. hatte einen pfadfehler drin, obwohl er nicht gemeckert hat.. naja.
ein problem habe ich nocht. ich kann jetzt zwar die geerbten funktionen aus der DBAccess nutzen, jedoch nicht die der Klasse von der ich das Objekt erstellt habe.
also von der "com.log.lud.sql.IFC_test"
dort ist zb. diese methode enthalten:
-----------------
public boolean deleteByKey(int key) throws SQLException
{
boolean status= false;
if (connect())
{
// hier findet die SQL operation statt
}
return TGstatus;
}
------------------
sollte doch eigentlich gehen oder? pfad etc ist alles korrekt.
wenn ich aber "objekt.deleteByKey(zahl);"
angebe makiert er mir das als fehler, nicht vorhanden etc. automatisch angezeigt wird es auch nicht.
hmm.. das versteh ich jetzt nicht. ich dachte mein objekt wäre ein instanz der klasse "com.log.lud.sql.IFC_test" und hätte die eigenschaften von DBAssess geerbt. warum muss ich das objekt jetzt nochma nach "com.log.lud.sql.IFC_test" casten ??
Weil du's beim Laden allgemein gehalten hast (Object) und dann lediglich nach DBAccess gecastet hast. Somit ist es als "DBAccess" bekannt. Wenn "IFC_test" von DBAccess erbt, kannst du einfach einmal nach IFC_test casten und schon hast du Zugriff auf alles in IFC_test und hast die Methoden aus DBAccess.
Kannst ja mal in der JavaInsel zum Thema "casten" nachschlagen. Dann wird dir einiges klarer.
Java ist statisch getypt. Wenn eine Variable vom Typ DBAccess ist, kannst du nur Methoden aufrufen, die in der Schnittstelle von DBAccess definiert sind. Das prüft schon der Compiler. Dabei ist völlig egal, von welcher Klasse das eigentlich Objekt in dieser Variable ist.
In dynamisch typisierten Sprachen ist das anders. Da gibt es keine Casts.
glaube mein problem ist, das ich den klassennamen nicht als pfad da habe sonder lediglich als string. das ganze sollte ja variable gehalten werden ?! oder hat das damit nichts zu tun ?
dann kann ich auch auf die methoden zugreifen. problem ist einfach, das ich die Klasse vorher nicht kenne und den klassennamen als string zugewiesen kriege... und so funktioniert es ja nicht =)
dass du die Klasse nicht kennst ist ja noch halbwegs verständlich, ansonsten könnte man sich alles sparen,
aber wenigstens die Methode sollte in einem Interface vorgegeben sein,
public interface Executer {
public void executeQuery(String query);
}
wenn dann IFC_test dieses Interface implementiert, kannst du
Executer ex = (Executer) newObject;
ex.executeQuery("");
schreiben
aber das ist ja alles wie bei DBAccess, sollte eigentlich bekannt sein...
leider implementiert die klasse kein interface .. also alles von hand. die methodenaufrufe sollten aber immer gleich sein. das würde dann schonmal gehen.