Schrift
[thread]5429[/thread]

Sub-Modul erstellen: Wie?

Leser: 2


<< >> 10 Einträge, 1 Seite
pktm
 2004-07-22 22:46
#48895 #48895
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe mir ein kleines Modul namens CMS.pm geschrieben.
Jetzt würde ich gerne ein kleines Modul namens Galerie.pm schreiben, welches die Methoden von CMS.pm erbt und erweitert.
a) Wie nennt man sowas dann?
b) wie geht das?
Dachte ich muss dafür einfach sowas hier schrieben, aber dann findet er die Methoden des Moduls CMS.pm nicht mehr:
Code: (dl )
1
2
3
4
package CMS::Galerie;
use base 'CMS';
...
1;

Die Module sind mittels CGI::Application (-Framework) geschrieben.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Ishka
 2004-07-22 22:48
#48896 #48896
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
ging das nicht mit push @ISA,'CMS'; ? (rumprobieren, ich programmier selten oo)
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
pktm
 2004-07-22 22:56
#48897 #48897
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Was ist @ISA?
Wo muss ich das hinschrieben?
In einem BEGIN-Block oder im Code?
http://www.intergastro-service.de (mein erstes CMS :) )
Ishka
 2004-07-22 23:10
#48898 #48898
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@ISA ist eine Spezialvariable, die allerdings erst mit use vars eingebunden werden muß. Allerdings weiß ich das nicht mehr so genau. Ich glaube, es muß nicht in einem BEGIN-Block, kann aber nicht schaden.

Aber wie gesagt: Rumprobieren..
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
pktm
 2004-07-23 00:22
#48899 #48899
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Man muss scheinabr das Modul laden und kann dann mittels our @ISA = wq( Modul ); die Methoden einbinden.
Geschiet im Code.
Werde es mal verushcen.

Aber was hat es mit dem CMS::* auf sich?
Bedeutet das nur, dass sich das Modul im Verzeichnis CMS befindet oder hat das noch andere Wirkungen?
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-07-23 01:43
#48900 #48900
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,22.07.2004, 20:46]
a) Wie nennt man sowas dann?
[/quote]
Vererbung
und das Erweitern geschieht durch das "Ueberschreiben der Methoden der Basisklasse".

Quote
b) wie geht das?


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;

CMS->foo();
CMS->bar();

CMS::Galerie->foo();
CMS::Galerie->bar();

package CMS;

sub foo {print "foo von CMS\n";}

sub bar {print "bar von CMS\n";}

package CMS::Galerie;

use base qw(CMS);

sub foo {print "foo von CMS::Galerie\n";}

Quote
Dachte ich muss dafür einfach sowas hier schrieben, aber dann findet er die Methoden des Moduls CMS.pm nicht mehr:

Das passiert wenn du versuchst die geerbte Methode via der ::- statt der Pfeil-Notation aufzurufen
Code: (dl )
CMS::Galerie::bar();

Die Gruenden warum das so ist weisz ich jetzt nicht mehr genau, kann es mir aber denken.

Quote
Man muss scheinabr das Modul laden und kann dann mittels our @ISA = wq( Modul ); die Methoden einbinden.
Geschiet im Code.
Werde es mal verushcen.

Das Modul muss natuerlich vorerst geladen werden damit der Code erstmal bekannt ist.
Statt die Module dem @ISA hinzuzufuegen kannst du (wie du es schon mal stehen hattest) use base qw(Modulname) verwenden.
use base macht eigentlich auch nichts weiter als die angebenen Module einzubinden und die Modulnamen @ISA hinzuzufuegen.
Quote
Aber was hat es mit dem CMS::* auf sich?
Bedeutet das nur, dass sich das Modul im Verzeichnis CMS befindet oder hat das noch andere Wirkungen?

CMS::Galerie::foo() und Galerie::foo sind schon gewaltige Unterschiede (keine Ahnung wie ich das haette verstaendlicher schreiben sollen *g*).
,,Das perlt aber heute wieder...'' -- Dittsche
[E|B]
 2004-07-23 11:44
#48901 #48901
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
@ISA ist eine Spezialvariable, die allerdings erst mit use vars eingebunden werden muß.


Nein, es ist keine Pflicht zuerst ein use vars zu machen.

Nachtrag: "vars" deklariert einfach nur globale Variablen. Häufig, aber nicht immer, wird @ISA tatsächlich mit use vars eingebunden.\n\n

<!--EDIT|[E|B]|1090568738-->
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
ptk
 2004-07-23 12:53
#48902 #48902
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Ishka,22.07.2004, 20:48]ging das nicht mit push @ISA,'CMS'; ? (rumprobieren, ich programmier selten oo)[/quote]
Code: (dl )
use base "Modul"
ist fast aequivalent zu
Code: (dl )
require Modul; push @ISA, "Modul";
pktm
 2004-07-23 14:46
#48903 #48903
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
das require Modul; wird aber durch use base nicht zur Laufzeit eingebunden - oder?
http://www.intergastro-service.de (mein erstes CMS :) )
coax
 2004-07-23 15:00
#48904 #48904
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,23.07.2004, 12:46]das require Modul; wird aber durch use base nicht zur Laufzeit eingebunden - oder?[/quote]
richtig, es ist viel mehr ein
Code: (dl )
BEGIN { require Modul; push @ISA, 'Modul' }

wird also zur Kompilierzeit eingebunden.
,,Das perlt aber heute wieder...'' -- Dittsche
<< >> 10 Einträge, 1 Seite



View all threads created 2004-07-22 22:46.