Avatar billede nielsbrinch Nybegynder
06. oktober 2004 - 10:41 Der er 9 kommentarer og
3 løsninger

Korrekt objektorientering med abstrakt klasse

Jeg har en abstrakt klasse med 10 variabler og så har jeg 5 klasser som arver fra denne abstrakte klasse. De har hver endnu 5 variabler.

Kan det passe jeg så skal definere alle 15 variabler i konstruktørerne på de 5 klasser? Her er et eksempel på hvad jeg snakker om.

class AbstractBil
{
  string hjul;
  string rat;
  string døre;

  public AbstractBil(string hjul, string rat, string døre)
  {
    this.hjul = hjul;
    this.rat = rat;
    this.døre = døre;
  }
}

class Mazda : AbstractBil
{
  string mazdaService;
  string kofanger;

  public Mazda(string hjul, string rat, string døre, string mazdaService, string kofanger)
  {
    this.hjul = hjul;
    this.rat = rat;
    this.døre = døre;
  }
}

Kan I se pointen - konstruktøren i de nedarvende objekter bliver unødigt lang.
Avatar billede bennytordrup Nybegynder
06. oktober 2004 - 10:44 #1
Umiddelbart kan jeg ikke se anden måde, hvis tingene skal sættes på constructor niveau.

Alternativt er at lave en tom constructor, der kun sætter til standardting og derefter sætte variablerne efter initiering via properties.
Avatar billede snepnet Nybegynder
06. oktober 2004 - 10:49 #2
denne her kan også være nyttig :

    public abstract class SomeBase
    {
        private string test;
        public SomeBase(string test)
        {
            this.test = test;
        }
    }

    public class SomeSpecialization : SomeBase
    {
        public SomeSpecialization(string test) : base(test)
        {
            //
        }
    }

og du kan også "henvise" til lokale konstruktører med

public SomeSpecialization(...) : this(...)
Avatar billede bennytordrup Nybegynder
06. oktober 2004 - 10:52 #3
snepnet >> Det løser ikke problemet med, at der i en nedarvet klasse tilføjes nye egenskaber. Det gør dit eksempel ikke.
Avatar billede snepnet Nybegynder
06. oktober 2004 - 10:58 #4
Hvorfor gør det ikke det ?
    public abstract class SomeBase
    {
        private string test;
        public SomeBase(string test)
        {
            this.test = test;
        }
    }

    public class SomeSpecialization : SomeBase
    {
        private string someOtherTest;
        public SomeSpecialization(string test, string someOtherTest) : base(test)
        {
            this.someOtherTest = someOtherTest;
        }
    }
Avatar billede arne_v Ekspert
06. oktober 2004 - 10:58 #5
Det løser ikke problemet med de mange parametre, men jeg synes absolut
at det er kønnere at sætte super klassens members i dens constructor
fremfor direkte.
Avatar billede arne_v Ekspert
06. oktober 2004 - 11:03 #6
Jeg synes iøvrigt ikke at det er et specielt OO problem.

Muligheder:

1)  alle data som individuelle argumenter til constructor (som du selv nævner)
2)  constructor uden argumenter og set metoder / properties / public members
    (som Benny foreslår)
3)  constructor med et argument et DTO som indeholder alle data
4)  se næste kommentar

På en eller anden måde skal de data ind.
Avatar billede arne_v Ekspert
06. oktober 2004 - 11:06 #7
Hvis dit klasse hiraki giver mening, så bør dine konkrete klasser
nederst i dit hiraki have constructorer med få argumenter.

Constructorerne kalder så opad i hirakiet. Med en masse konstanter
bestemt af hvilken konkret klasse det er.

Men hvis du gemmer alt det (non public), så er det usynligt hvordan
du gør det og så betyder det ikke så meget om du vælger 1, 2 eller 3
der !
Avatar billede nielsbrinch Nybegynder
06. oktober 2004 - 11:07 #8
Ja, det er rigtigt, det ER kønnere. Så er det om ikke andet hurtigt lige at copy-paste base()-konstruktøren i de forskellige specialiserede klasser.

Jeg takker for jeres indsigt. Svar.
Avatar billede snepnet Nybegynder
06. oktober 2004 - 11:09 #9
svar herfra :o)
mvh
Avatar billede nielsbrinch Nybegynder
06. oktober 2004 - 11:33 #10
Vil du ikke være med, arne_v?
Avatar billede arne_v Ekspert
06. oktober 2004 - 11:36 #11
tjo
Avatar billede nielsbrinch Nybegynder
06. oktober 2004 - 13:45 #12
De sidste 0,01 pts. er forsvundet :-)
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