Wenn du dazu noch typsicher sein willst, dann musst du alle Klassen "sehen".
Du kannst entweder deine Klassen alle in eine Script-Bibliothek packen (unschön) oder in einer gemeinsamen Scriptbibliothek nur die "Interfaces" mit leeren Rumpfmethoden aufnehmen und wie Tode schon gepostet hat, mit Dynaloading dann entsprechende Instanzen erzeugen.
Ein ähnliches Verfahren verwenden wir auch in unserem Framework und das Ergebnis ist performant (da die "großen" Programmteile erst bei Bedarf geladen werden) und der Code bleibt wartbar. (da typesafe)
Das einzige Problem ist halt die Mehrarbeit für die Interfaceklassen.
| ------- Commons --------- |
| Option Declare |
| |
| Public Class AInterface |
| Public Sub Init(c as BInterface) |
| error 2000, "AbstractMethodCalled" |
| End Sub |
| End Class |
| |
| Public Class BInterface |
| Public Sub Init(c as AInterface) |
| error 2000, "AbstractMethodCalled" |
| End Sub |
| End Class |
| |
| public function dynaload(className as String) |
| '... hier muss das dynamische Classloading rein |
| end function |
| |
| -------Module_A--------- |
| Use "Commons" |
| Option Declare |
| |
| Public Class AClass extends AInterface |
| Function Produce(param as Variant) |
| Dim instance as new AClass() |
| if param isA BInterface then call instance.init(param) |
| set produce = instance |
| End Sub |
| |
| |
| Sub Init(c as BInterface) |
| |
| End Sub |
| End Class |
| |
| |
| |
| -------Module_B--------- |
| Option Declare |
| Use "Commons" |
| |
| Public Class BClass extends BInterface |
| |
| Private m_cAc as AInterface |
| |
| Sub Produce(param as variant) |
| dim instance as new BClass() |
| Set instance.m_cAc = newObj("Module_A", "AClass", me) |
| set produce = instance |
| End Sub |
| |
| End Class |
| |
Hab das jetzt mal frei Hand geschrieben, kann also noch der ein oder andere Fehler versteckt sein