Avatar billede brian0905 Nybegynder
02. august 2006 - 11:10 Der er 5 kommentarer og
2 løsninger

Arv og constructorer

Hejsa,

Jeg har en genericsk klasse der skal loade et billede fra en sti i dens constructor. selve stien skal angives af hver enkelt specialisering, men jeg synes jeg har lidt problem er med at kalde base constructoren efter at have sat min sti til billdedet property.

fx:

class GenericClass
{
  protected path;
  potected image;

  public GeneticClass()
  {
    image = Bitmap.FromFile(path);
  }
}

class SpecificLoader : GenericLoader
{
  public SpecificLoader()
  {
    path = "mitbillede.jpg";
    base.her-vil-jeg-så-kalde-min-supers-constructor;
  }
}
Avatar billede bennytordrup Nybegynder
02. august 2006 - 11:36 #1
Constructor uden parameter er altid implicit, så den har du uanset, om du koder den eller ej.

Du kan ændre designet således:

class GenericClass
{
  protected path;
  potected image;

  public GeneticClass(string path)
  {
    image = Bitmap.FromFile(path);
  }
}

class SpecificLoader : GenericLoader
{
  public SpecificLoader() : base("mitbillede.jpg")
  {
  }
}
Avatar billede bennytordrup Nybegynder
02. august 2006 - 11:36 #2
Det skulle være et svar
Avatar billede nielle Nybegynder
02. august 2006 - 11:46 #3
> Constructor uden parameter er altid implicit, så den har du uanset, om du koder den eller ej.

Det er nu ikke helt rigtigt. Hvis man ikke selv laver nogen constructor så får man altid en implicit constructor. Lige så snart man selv laver en, vil denne ikke blive oprettet:

    class Program
    {
        static void Main(string[] args)
        {
            Demo1 d1 = new Demo1();

            Demo2 d2 = new Demo2();  // Giver fekl
        }
    }

    class Demo1
    {
    }

    class Demo2
    {
        Demo2(int value)
        {
        }
    }
Avatar billede nielle Nybegynder
02. august 2006 - 11:52 #4
Bortset fra denne krølle er det korrekt.

Nåe en nedarvende klasse kalder suberklassens constructor så skal det altid ske før at man udføre anden kode i constructoren. Derfor er syntaksen:

    class SpecificLoader : GenericLoader
    {
        public SpecificLoader() : base("mitbillede.jpg")
        {
            // ... og så resten af koden i constructoren
        }

        public SpecificLoader(string path) : base(path)
        {
            // ... og så resten af koden i constructoren
        }
    }
Avatar billede brian0905 Nybegynder
02. august 2006 - 14:22 #5
Jeg tænkte nok, at jeg ikke kunne gøre det som jeg gerne ville... Ideen var at jg ville hardcode billednavnet i min klasse så det var godt indkapslet. Jeg er godt klar over løsningen med at sende en parameter med til constructoren, men jeg håbede at jeg kunne gøre det udelukkende ved at ændre en instansvariabel (som jeg ofte gør det i Delphi, hvor man i Objekt pascal, altid kan kalde sin nedarvede constructor, og ikke er bundet af at skulle gøre det i starten).. Tak til jer begge, nielle giver du lige et svar så fordeler jeg pointene mellem jer :-)
Avatar billede nielle Nybegynder
02. august 2006 - 15:31 #6
Et svar ...

... men jeg synes at du skal give de fleste points til bennytordrup. :^)
Avatar billede bennytordrup Nybegynder
03. august 2006 - 08:35 #7
nielle >> Ja, hvis jeg lige tænker mig om, så har du faktisk ret omkring den med, at man opretter en constructor med parameter. Men det er jo ikke noget problem at oprette en tom constructor, som kun kalder base constructor.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester