[vienna.pm] Packages
Johannes Fuernkranz
juffi at ai.univie.ac.at
Mon Jan 8 16:03:13 CST 2001
* * * vienna-pm-list * * *
Toni Andjelkovic wrote:
>
> lies den abschnitt über vererbung (inheritance) im kamel, pp. 321
> oder den entsprechenden abschnitt in 'perldoc perltoot'.
> soweit ich es verstanden habe, möchtest du dass eine super-class
Sorry, da war nicht genau genug. Das sind keine Methoden!
package A definiert nur ein paar Funktionen, die eben ueber das normale
Export-Interface exportiert werden sollen.
Package A::B dagegen (wie gesagt im selben File) definiert eine Klasse,
die von A verwendet werden soll. Weiters wird im Package A::B eine Art
Konstante (als Funktion ohne Argumente) definiert, die vom Typ/Klasse
A::B ist (also ein bestimmte vordefinierte Instanz dieser Klasse). Diese
moechte ich aus dem gesamten Package exportieren. Da ich im package A
nicht ´use A::B´ schreiben kann (dann sucht er das File A/B.pm, welches
es nicht gibt, es gibt nur ein A.pm), musz ich (glaube ich) irgendwie
die Konstante in den Namespace von A bringen, damit ich ihn von dort aus
exportieren kann.
Also etwas detaillierter:
------ Beginn A.pm ------
package A;
# A ist keine Klasse, sondern ein File, in dem
# mehrere Klassen/Datenstrukturen definiert werden, die man nur zusammen
# inkludieren kann.
use base 'Exporter';
@EXPORT qw(constantXYZ);
# Die folgenden 4 Zeilen moechte ich eleganter loesen!
# Insbesondere so, dasz ich das ganze automatisch machen koennte,
# wenn ich eine Liste der Symbole haette, die in A::B definiert,
# aber aus A exportiert werden sollen.
use subs(qw(constantXYZ));
sub constantXYZ {
return A::B::constantXYZ();
}
package A::B;
# Das ist eine Klasse
# constructor fuer A::B;
sub new {
.....
}
# methode fuer A::B;
sub doit{
....
}
# constantXYZ definiert eine Konstante von Typ A::B
# es ist keine Methode!
sub constantXYZ {
return A::B::new('xyz');
}
package A::C;
# Das ist eine andere Klasse
....
----- Ende A.pm --------
Das kann ich nun so verwenden:
use A;
constantXYZ->doit();
Die Frage ist nun, ob man das irgendwie eleganter loesen kann, sodasz
ich in A keine Extra-Prozedur definieren musz.
> oder du machst in A eine AUTOLOAD-methode, die
> ihrerseits eine methode von A::B aufruft, aber
> das finde ich nur begrenzt sinnvoll.
An AUTOLOAD hab ich auch schon gedacht, aber das erscheint mir auch nur
begrenzt sinnvoll (noch dazu wo ich das AUTOLOAD schon fuer was anderes
verwende :-) )
>> Beide packages sind in einem File, was ich aus verschiedenen (vermutlich
>> dummen) Gruenden beibehalten moechte.
>
> gehe in dich und erforsche die dummen gründe [:)] cu,
Ich werde auf jeden Fall in mich gehen, und vermutlich doch aus dem
ganzen 3 Files machen (A.pm, A/B.pm, A/C.pm) dann geht es vielleicht.
Obwohl, sicher bin ich mir nicht, weil das package A::B natuerlich ein
'use A' enthaelt, sodasz das irgendwie zirkulaer wird, wenn ich dann ins
package A ein 'use A::B' hineinschreibe. Aber ich kann mir vorstellen,
dasz das perl das trotzdem schluckt.
Auf jeden Fall danke!
Juffi
PS: Freut mich, dasz es die Liste noch gibt. Schoenes neues Jahr an alle!
###
You are subscribed to vienna-pm-list as Johannes Fuernkranz <juffi at ai.univie.ac.at>
http://www.fff.at/fff/vienna.pm/
More information about the Vienna-pm
mailing list