Perl5 OOP Overload und für was das gut ist

Der Kontext bestimmt das was die Instanz zurückgibt, ein Scalar oder sich selbst

Zur Demonstration, was Overload bewirkt, betrachte untenstehenden Code einer main-Klasse:

package main;

use strict;
use warnings;
use base 'Scaliger';

sub bool{ shift };
use overload (
    '""' => sub{
        my $self = shift;
        return $self->jd();
    }
);

# Übergeben wurde der Package-Name
# die Instanz wird hier erstellt
sub date2jd{
    my $pkg = shift;
    my $self = $pkg->new(@_);
    return $self;
}

print
main->date2jd();
# heutiger julianischer Tag
# wird ausgegeben

Erläuterungen Schritt für Schritt

Als Erstes wird mit use base 'Scaliger'; festgelegt, daß die zum Script gehörige main-Klasse von der Klasse Scaliger erbt. Da mit dem Antritt der Erbschaft auch der Konstruktor geerbt wird, kann dieser mit $pkg->new(@_) innerhalb der eigens definierten Methode date2jd() unmittelbar aufgerufen werden. Somit wird letztendlich beim Aufruf dieser Methode mit dem Namen der Package main main->date2jd(); eine explizites Erstellen einer Instanz umgangen.

Die Methode date2jd() gibt also die gerade eben erstellte Instanz selbst zurück. In der print main->date2jd() Ausgabe jedoch erscheint der Julianische Tag. Zum Verständnis, warum das so ist, betrachten wir die weiter obenstehende Definition für's Overload, die dem print-Kontext '""' (Literalausgabe) eine entsprechende Funktionsreferenz zuweist. Innerhalb dieser Methode nun wird wie gewöhnlich die Instanz selbst aus der Argimentenliste extrahiert. Zu guter Letzt wird mit dieser Instanz eine geerbte Methode jd() aufgerufen welche schließlich den julianischen Tag zurückgibt.

Entsprechend dem Konstruktor der Basisklasse kann selbstverständlich auch die Übergabe eigener Argumente erfolgen:

print
main->date2jd( date => '4.10.1582' );
# 2299160

Abschließend noch ein Beispiel zur expliziten Erstellung der Instanz:

my $dateobject = main->date2jd( date => '4.10.1582' );
printf "Kalender: %s, Julianischer Tag: %d",
    $dateobject->age(), $dateobject->jd();
# Kalender: J, Julianischer Tag: 2299160

# anderes Beispiel:

my $dateobject = main->date2jd( date => '15.10.1582' );
printf "%s, Julianischer Tag: %d",
    $dateobject->age() eq 'J' ?
    'Julianischer Kalender' : 'Gregorianischer Kalender',
    $dateobject->jd();
# Gregorianischer Kalender, Julianischer Tag: 2299161

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.