Avatar billede wmann Nybegynder
23. juli 2008 - 10:32 Der er 9 kommentarer

Implementering af abstract classes

Jeg har lavet et lille hieraki med nogle metoder på nogle abstract klasser. Disse er fx. debug-metoder, skrivTilFil-metoder, exceptionhandling-metoder etc.
Meningen er disse skal bruges til en logger MEN men men.. Min Debug-Logger skal have metoderne fra både ImplDebug (debug metoderne) og ImplException (Exception handling) men hvordan kan dette løses når c# ikke tillader nedarvning fra flere klasser men kun flere Interfaces?

jeg ved jeg kunne impl. et interface MEN så forsvinder det smukke ved hierakiet for så hvis noget skal ændres ved exception-metoderne vil jeg skulle rette to steder og det jo ikke ret smuk kode.
Avatar billede arne_v Ekspert
23. juli 2008 - 15:00 #1
Arv er til at modellere "is a" egenskaber ikke til at sikre genbrug af vilkaarlig kode.

Standard loesningen er interfaces og saa implementere.

Den alternative loesning er at klistre de ting paa med AOP, som er en smart maade
at tilfoeje faelles funktionalitet af mere teknisk art som ligger ud over
domain modellen.
Avatar billede wmann Nybegynder
23. juli 2008 - 15:30 #2
JEG har lært netop at arv netop er til genbrug så du undgår redundans.

Fx. klassen abstract human
kan have fælles attributter som hjerte, lunger, hjerne etc.
og fælles metoder som Walk(), Eat() etc.

Man kan så nedarve til specialiseringer så som:
CaveMan : Human

som nu har attributter og metoder fra Human. Det da "genbrug af vilkaarlig kode" og det meningen jo.
CaveMan kan så have en anden hjerne (hvis det objekt fx), og andre metoder som HitWomanAndDragByHair().

Fx. SuperBrain
Generelle metoder og attributter
og så har vi
CaveMannBrain : SuperBrain (måske dårligt ordvalg)
som har nogle dyriske indstinker der gør ham lidt vild til tider.

Og man har en moderne hjerne
SofisticatedBrain
som har attributter til tale og skrive og metoder til samme.

Hvis man så har klassen
ModernMann kan han ligeledes nedarve fra human og være en specilisering, MEN hvad nu hvis man så i ModernMann gerne vil ha BÅDE SofisticatedBrain (fordi det er den moderne mand), MEN man også vil have CaveMannBrain (fordi han stadig har sine dyriske urlyster gemt i sig).. Så laver man en ModernMannBrain men kan bare ikke implementere begge dele..
Og du kan ikke specialisere ModernBrain fordi den samme bruger ModernWoman fx. og så er problemet jo du får samme attributter og metoder i både ModernWomanBrain og ModernMannBrain fordi de begge skal bruge de fælles attributter fra SofisticatedBrain men også deres respektive "gammeldags" hjerner..

Og ja du KAN bruge interfaces MEN det hjælper dig ikke ud af du får redundant kode som er noget skrammel for HVAD nu hvis du ændrer noget i koden et sted men glemmer at rette det det andet sted..

AOP? Der tror jeg desværre ikke helt jeg er med længere..
Er det et design mønster? jeg ku se på wikipedia at der noget der hedder "Aspect-oriented programming".. Er det noget af det?
Og hvis det er tilfældet vil jeg meget gerne høre hvordan det kan laves så jeg kan få implementeret begge dele et fælles sted..
Avatar billede wmann Nybegynder
23. juli 2008 - 15:39 #3
Så vidt jeg kunne læse mig ud af det kan den lave referencer til andre kodesteder. Er det lidt alla goto over klasser og ikke kun sektioner der er defineret?
Derudover synes jeg ærligt talt det er lidt tåget og svært lige at fange konseptet i..
Avatar billede arne_v Ekspert
23. juli 2008 - 15:47 #4
Nej. Arv er ikke decideret til at undgaa redundant kode. Arv er til at modellere
generalisering/specialisering. Det har som positiv side effekt at man nogen gange kan
genbruge noget kode.

Ja - AOP er Aspect Oriented Programming. Og det er et rimeligt avanceret koncept. Men
efter min bedste overbevisning velegnet til det du vil.
Avatar billede arne_v Ekspert
23. juli 2008 - 15:50 #5
Med hensyn til arv, saa blev James Gosling (opfinder af Java) engang spurgt
om hvilken feature han fortroed mest i Java og han svarede extends (som er keyword
for arv fra en anden klasse).

Det skal man nok ikke tage alt for bogstaveligt. Men pointen er at det ikke er
godt at arve fordi man lige skal bruge en klump funktionalitet.
Avatar billede arne_v Ekspert
23. juli 2008 - 15:50 #6
Til AOP i C# vil jeg foreslaa AspectDNG.
Avatar billede kodehoved Nybegynder
24. juli 2008 - 10:13 #7
Jeg kan kun tilslutte mig arne_vs betragtninger, men hvis jeg skal komme med et bud på, hvordan du kan opnå, det du spørger til, vil jeg sige, at du skal se på "composition". Du kan altså lade din logger holde instanser af de andre klasser og viderestille de nødvendige operationer til dem.
Avatar billede wmann Nybegynder
24. juli 2008 - 10:39 #8
Arne v
I min uddannelse som datamatiker har jeg nu lært andet.. Altid undgå redundant data så vidt muligt. Bedre at lave generelt så du slipper for redundant kode og genbrugsværdien er ligeledes større da afhængigheden derved er mindre..
Anyways..
Men tak jeg vil prøve og læse mere op på det.. Hvis jeg ikke kan finde ud af det får du nok nogle spørgsmål omkring det..

kodehoved
composition er det også c#-baseret? Og vil det sige jeg kan "nedarve" metoder som jeg har behov for, eller blot referere til dem så og sige..?
Avatar billede kodehoved Nybegynder
24. juli 2008 - 11:50 #9
Med al respekt for din uddannelse, så lyder det som om at din underviser ikke har fulgt med tiden. I midten af 90erne var arv løsningen på alle problemer, men konsensus i dag er, at arv skal bruges i begrænset omfang og mere eller mindre kun i de situationer Arne nævner.

Composition er en generel OO-teknik, hvor du i stedet for at bygge dine relationer via arv, gør det via referencer til andre typer. Så hvis A har brug for funktionalitet fra B og C, har A en reference til disse og sørger derefter for at lade disse delkomponenter varetage deres respektive opgaver. Vil du gå skridtet videre, skal du bruge referencer til interfaces fremfor referencer til specifikke typer. Derved opnås langt større fleksibilitet i forhold til test, vedligeholdelse og udvidelse af koden.
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