Autor Thema: Vererbung innerhalb eines package  (Gelesen 260 mal)

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Vererbung innerhalb eines package
« am: 11 März 2017, 20:06:21 »
Ich möchte eigene Funktionen innerhalb eines Moduls kapseln. Dafür würde ich package verwenden, allerdings würde ich gern innerhalb des package alle anderen Funktionen von main weiterhin verwendbar machen wollen.

Wie kann ich das realisieren?
FHEM-Module: DOIF, THRESHOLD; FHEM-Befehl: IF

Offline Dr. Boris Neubert

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 3634
Antw:Vererbung innerhalb eines package
« Antwort #1 am: 11 März 2017, 20:10:08 »
main::foobar()
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Antw:Vererbung innerhalb eines package
« Antwort #2 am: 11 März 2017, 20:14:40 »
main::foobar()

das weiß ich, ich möchte die Funktionen aus main aber ohne main:: ansprechbar machen.
FHEM-Module: DOIF, THRESHOLD; FHEM-Befehl: IF

Offline Thorsten Pferdekaemper

  • Tester
  • Hero Member
  • ****
  • Beiträge: 3780
  • Finger weg von der fhem.cfg
Antw:Vererbung innerhalb eines package
« Antwort #3 am: 11 März 2017, 20:45:24 »
Hi,
also vielleicht so ungefähr...
no strict;
foreach my $entry (key %main::) {
    next unless(ref($main::{$entry}) eq "CODE");
    ${__PACKAGE__."::"}{$entry} = $main::{$entry};
}
use strict;
Ausprobiert habe ich das nicht.
Gruß,
   Thorsten
RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Antw:Vererbung innerhalb eines package
« Antwort #4 am: 11 März 2017, 20:48:13 »
Das muss doch einfacher gehen:

Ich habe an so etwas gedacht:

{
  package meineunterklasse;
  @ISA=("meineklasse");
}

aus https://de.wikibooks.org/wiki/Perl-Programmierung:_Objektorientiert_Programmieren_in_Perl

@ISA kennt er bei mir aber nicht.
FHEM-Module: DOIF, THRESHOLD; FHEM-Befehl: IF

Offline Thorsten Pferdekaemper

  • Tester
  • Hero Member
  • ****
  • Beiträge: 3780
  • Finger weg von der fhem.cfg
Antw:Vererbung innerhalb eines package
« Antwort #5 am: 11 März 2017, 20:58:55 »
RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Antw:Vererbung innerhalb eines package
« Antwort #6 am: 11 März 2017, 21:08:32 »
schon alles probiert.

{
package test1;
sub TS ($)
{
my ($WT) = @_;
return ("$WT bla");
}
}
{
package test;
@ISA=qw(test1);
use strict;
eval ('
sub TT ($)
{
my ($WT) = @_;
return ("$WT bla");
}');

print TT("test1");

print TS("test1");
}

TS kennt er nicht. eval ist hier Absicht, da die Definition vom User kommt.
FHEM-Module: DOIF, THRESHOLD; FHEM-Befehl: IF

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 16201
Antw:Vererbung innerhalb eines package
« Antwort #7 am: 11 März 2017, 21:53:15 »
schau dir mal Exporter an. das macht glaube ich im prinzip was du willst.

aber ist das wirklich das was du willst? du willst packages damit sich namen nicht ins gehege kommen möchtest dann aber trozdem ohne namespace zugreifen. in dem du den namespace wieder weg nimmst erzeugst du doch potentiell genau wieder die konflikte die du vermeiden willst. du kannst auch von aussen nicht einen festen namespace für das eval vorgeben, da jedes eval dann in diesem namespace läuft und sich dann zwei evals ins gehege kommen.

vielleicht kommst du mit anonymen routinen und/oder pointern darauf weiter. d.h. der anwender schreibt nur {...}


FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Antw:Vererbung innerhalb eines package
« Antwort #8 am: 11 März 2017, 22:15:12 »
Hintergrund ist dieses: https://forum.fhem.de/index.php/topic,68705.msg603062.html#msg603062

Ich wollte pro Instanz ein eigenes package erzeugen.

Der User sollte aber nicht mit package-Angaben hantieren müssen wie im Beispiel.

Man kann natürlich die Kapselung weg lassen, aber dann bin ich wieder bei myUtils, wo man nur hoffen kann, dass der User sich eigene Funktionen ausdenkt, die nicht kollidieren und er die Präfix-Vorgabe einhält - aber dieses Vorgehen das gefällt mir nicht.


FHEM-Module: DOIF, THRESHOLD; FHEM-Befehl: IF