Konstruktører til klasser i VBScript

Konstruktører er noget man mangler i VBS, hvis man er vant til at arbejde med mere udviklede objektorienterede sprog. Vi kan desværre ikke tweake VBS til at understøtte dette, men vi kan lave en simulering af en konstruktør, nemlig ved at lave en factory-funktion, som kan tage de parametre vi ønsker klassen skal starte med at have når vi tager den i brug.

Hvis vi laver en klasse der indeholder lidt egenskaber (for at illustrere princippet):

class CPerson
  private m_fornavn
  private m_efternavn

  public property get fornavn: fornavn = m_fornavn: end property
  public property let fornavn(value): m_fornavn = value: end property
  public property get efternavn: fornavn = m_fornavn: end property
  public property let efternavn(value): m_efternavn = value: end property
end class

Så skal denne klasse under normale omstændigheder oprettes således:

dim person
set person = new CPerson
person.fornavn = "John"
person.efternavn = "Farnham"

Hvis vi laver en factory-funktion der tillader os at angive fornavn og efternavn i parameterlisten og returnerer et objekt af typen CPerson, hvor disse egenskaber er sat:

function newPerson(pFornavn, pEfternavn)
  dim obj
  set obj = CPerson
  obj.fornavn = pFornavn
  obj.efternavn = pEfternavn
  set newPerson = obj
end function

...kan vi i stedet oprette en klasse af typen CPerson således:

dim person
set person = newPerson("John","Farnham")

Dette eksempel er ret simpelt, man kunne sagtens forestille sig større scenarier, hvor det ville være rart ikke at skulle forestå initieringen af objektets enkelte egenskaber der hvor det skulle bruges. Specielt i situationer hvor der er et mere komplekst regelsæt forbundet med at initiere objektet er det relevant at få det pakket væk i en factory-funktion.

Der kunne sagtens være flere factory-funktioner til samme klasse og i disse sammenhænge kunne man oprette en Factory-klasse som dannede interface til oprettelse af selve klassen. Eksempelvis:

class CPersonFactory
  public function newPerson()
    set newPerson = new CPerson
  end function

  public function newPersonNavn(pFornavn, pEfternavn)
    dim obj
    set obj = new CPerson
    with obj
      .fornavn = pFornavn
      .efternavn = pEfternavn
    end with
    set newPersonNavn = obj
  end function
end class

dim PersonFactoty
set PersonFactory = new CPersonFactory

Med de sidste 2 linier i overnstående eksempel, får jeg mulighed for bare at kalde mine factory-funktioner uden at skulle oprette en instans af factory-objektet først. Det vil sige følgende kan benyttes:

set person = PersonFactory.newPersonNavn("John", "Farnham")

Så har vi også simuleret en statisk klasse... :-)

Et alternativ til factory

Et alternativ til at lave en funktion som er ekstern til klassen er, at lave en funktion i klassen som tager nogle parametre som intialiserer objektet og derefter returnerer en reference til objektet selv. Det vil kunne ende i en sætning som ser således ud:

set obj = (new CPerson)("John","Farnham")

For at ovenstående fungerer, er det vigtigt at der er parantes omkring new CPerson, da dette, som bekdt opretter et objekt af klassen CPerson. For at kunne arbejde videre med objektet der oprettes i samme linie behøves paranteserne, da parameteren ellers vil blive oprettes som tilknyttet selve klassennavnet i stedet for objektet der kommer ud af new CPerson. Når det så er på plads, observerer vi, at objektet efterfølges af parantes med to strenge, hvilket rent faktisk er et funktionskald. Funktionskaldet sker til en default-funktion på objektet (derfor behøver vi ikke angive navnet på funktionen), som tager 2 parametre i dette tilfælde. For at variablen skal blive tildelt objektet som lige er oprettet, skal default-funktionen returnere en reference til objektet. Det ser nogenlunde således ud når det omsættes til en klasse:

class CPerson
  public Fornavn
  public Efternavn
  public default function Init(pFornavn, pEfternavn)
    Fornavn = pFornavn
    Efternavn = pEfternavn
    set Init = me
  end function
end class

Desværre (men naturligt nok), kan der kun eksistere én default-funktion på en klasse, så dette trick fungerer kun, hvis man ikke har behov for mere end det til at initialisere sit objekt.

 
Sidst opdateret: 04-09-2010 23:22:37
Tilmeld link | Tilføj Link | Tilføj Link | @-begynder
Erklæring om beskyttelse af personlige oplysninger

nope.dk - Danmarks Website Chart