[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