Philipp Hasenfratz: vererbung

Beitrag lesen

Halihallo

Also, wenn ich jetzt die Methode checkIntegrity von VWebsite starte, wird er mir die entsprechende Integrity-Methode von Website->Website::Integrity aufrufen, was ja _falsch_ ist, da ich nicht die Integrität der Website sondern der virtuellen Website (VWebsite) testen will... Für meine Anwendung ist also das depth-first-Verfahren schlecht...

In diesem konkreten Fall müßte eine andere Reihenfolge das gewünschte Ergebnis bringen.

@ISA = qw(VWebsite::Integrity VWebsite::Sync Website);

würde Sinn machen, wenn/tät ich nicht von Website erben (SUPER:: nimmt nur das Modul Index 0 aus ISA); aber ja, ich könnte es mit absolutem Modulnamen erben und die Reihenfolge von @ISA ändern...
Wär natürlich auch ein guter Vorschlag; nur will ich eben genau absolute Modulnamen verhindern, sonst hätte ich ja nie das Problem bekommen.

Perl bietet Dir aber auch die Möglichkeit, die Methode vollständig (mit Klasse) anzugeben, wodurch Du auch jederzeit genau spezifizieren kannst, welche Methode Du jetzt verwendest:

$self->VWebsite::Integrity::checkIntegrity();

ist mir schon klar, nur will ich das nicht immer eintippen müssen ;)
Sonst hätte ich es doch schon längst so gemacht... Aber erben ist viel schöner, als absolute Modulnamen zu setzen...

Ich hätte natürlich auch einfach in jedes Modul eine Methode einbauen können, welche den gleichen String zurückgiebt, aber das war mir zuviel arbeit (sind ca. 30 Klassen); da mache ich lieber eine Methode an _einem_ Ort, die vielleicht etwas komplizierter ist...

Alternativ hättest Du aber auch diese Methode in einer eigenen Klasse implementieren können, von der dann alle anderen erben.

Hab ich doch:

Integrity::Base => getIntegrityClass, getIntegrityInstance
Integrity::Website extends Integrity::Base
Integirty::VWebsite extends Integrity::Base
Integirty::Page extends Integrity::Base
...

Sync::Base => getSynchronisationClass, getSynchronisationInstance
Sync::Website extends Sync::Base
...

die genannte Methode ist in einer Klasse, welche von allen anderen "zwecksgleichen" Klassen geerbt wird.

---
im Übrigen bin ich ziemlich auf SUPER:: angewiesen und kann die Methoden nicht über absolute Modulnamen ansprechen, da ich sonst das ganze OOP-Konzept der Webapplikation durcheinander bringen würde. Das ganze Ding ist ziemlich kompliziert (aber schön!! ;)) aufgebaut, deshalb mach ich jetzt auch kein Beispiel (es sei denn es wäre gewünscht); du musst mir einfach glauben, dass ich auf SUPER:: angewiesen bin (ich hätte auch eine Lösung gefunden, wäre dem nicht so)...
---

Viele Grüsse

Philipp

PS: Ja, ja, was man nicht alles in Kauf nimmt, um "schön" zu programmieren... ;)