Avatar billede havmaage Juniormester
26. maj 2011 - 17:42 Der er 9 kommentarer og
2 løsninger

nedarvning mellem klasser

hej
jeg har læst at man ikke kan arve flere klasser
f.eks
har jeg  klasse a b c og d
jeg vil gerne have at klasse d nedarvede fra a b og c

class d : a b c  // må man ikke ?
{



Kan man omgåes dette på nogen måde, og giver det mening i forbindelse med "Best Practise" i object orienteret
Jeg anvender iøvrigt også interface til klasse d, kan man gøre noget i den forbindelse
Avatar billede Syska Mester
26. maj 2011 - 17:49 #1
Du kan ikke omgås det.

Du kan arve fra en klasse, men implementere mange interfaces.

Synes ikke det er ofte man har lyst til at arve fra flere klasser. Så bryder man vel, http://en.wikipedia.org/wiki/Single_responsibility_principle

Hvis du vil have funktionaliteten fra flere klasser i en.

Det lyder mere som om du vil bruge det a, b og c kan ... i din klasse d. Derfor har D en dependency på de 3 andre klasser.

Men jeg kan tage fejl. Der kommer nok en person med lidt mere input.
Avatar billede heinzdmx Nybegynder
26. maj 2011 - 17:50 #2
Nej, det kan du ikke så vidt jeg ved. Jeg tror det smarteste vil være at lave det om til et interface i stedet.

Du kunne evt. tage et kig på:
http://www.c-sharpcorner.com/UploadFile/cbreakspear/MultipleInheritance11082005004843AM/MultipleInheritance.aspx
Avatar billede arne_v Ekspert
26. maj 2011 - 18:40 #3
C# tillader ikke multipel implementations arv (arv fra flere klasser).

Der er andre sprog bl.a. C++ som tillader det.

Det er visse teoretiske problemer ved at tillade det. Se:
  http://en.wikipedia.org/wiki/Diamond_problem

Java valgte ikke at tillade det.

Og C# valgte at følge Java.

Det praktiske problem er ikke saa stort.

God OOP idag siger:
  Favor object composition over class inheritance

Saa i.s.f. at lade d arve fra a, b og c er det ofte bedre at lade d indeholde instanser ad a, b og c og saa forwarde kald.

Muligvis er multipel arv paa vej tilbage i det gode selskab. Ihvertfald tillader de 2 Java aflaeggere Scala og JavaFX begge multipel arv.
Avatar billede havmaage Juniormester
26. maj 2011 - 23:09 #4
Tusind tak for jeres svar, jeg tror jeg vil undersøge instanser af abc i d og så forwarde kald ( aner ikke hvordan ) men det må kunne googles
Vil i lægge svar begge 2 da begge svar er brugbare for mig.
Avatar billede arne_v Ekspert
26. maj 2011 - 23:13 #5
public class D
{
    private A myA;
    ...
    public void Foobar()
    {
        myA.Foobar();
    }
    ...
}
Avatar billede Syska Mester
26. maj 2011 - 23:15 #6
Nu er der 3 der har smidt en kommentar, hvem er de 2 ?

public class A
{
    public void MethodA()
    {
           
    }
}

public class B
{
    public void MethodB()
    {
           
    }
}

public class MyClass
{
    private readonly A _A;
    private readonly B _B;

    public MyClass(A a, B b)
    {
        _A = a;
        _B = b;
    }

    public void CallA_And_B()
    {
        _A.MethodA();
        _B.MethodB();
    }
}

En ide ... men løsningen på dit problem kan jo være mere simple hvis du kan/må/vil forklare hvad du prøvet at opnå ?

Overstående kan kan nemt bruges sammen med en IOC Container, endnu en meget praktisk ting i programmering.

mvh
Avatar billede havmaage Juniormester
27. maj 2011 - 12:08 #7
Ok
Det hele handler om at jeg skal udvikle en demo af et biblioteks system, jeg prøver at anvende en simpel udgave af Model View Controller modellen.

Dvs.
En controller klasse hvor der styrer / kalder metoder i en model klasse
alle udskrifter mm sendes til en view klasse

Da jeg vil simulerer at der ligger en database under vil jeg oprette klasser til hendholdsvis

Bøger / ibog_id,ndeholder forfatter, titel,isbn,antal
kunder / kunde_id, navn,adresse,lånenr 
udlån  / bog_id,lånenr,start_dato, slut_dato

Da jeg ikke har nogen fysisk data struktur som f.eks sql server vil jeg oprette objekterne med hashtable's eller Dictionary fordi de stiller nogle metoder tilrådighed f.eks contains, add m.m

For at skærme klasserne ville jeg gerne at metoderne i bog og kunde klassen kunne stilles tilrådighed for model klassen

  Jeg er bekendt med Observer og nogle af de ting der men ikke særlig meget, men det er ikke væsentlig for mig i denne opgave da det mest af alt handler om at skrive komtrakter til klassernes
metoder

Det er en synops opgave til eksammen hvor der skal være et funktionelt program med tilhørende kontrakter

Jeg er SAS programmør til daglig derfor finder jeg dette her C# en smule udfordrende men også sjovt at arbejde med.

Og ja sorry havde lige overset at der faktisk var 3 der havde kommenteret på tråden.
Avatar billede Syska Mester
27. maj 2011 - 15:09 #8
Jeg synes bestemt ikke overstående giver den mindste anledning til at bruge multiple arv. Composition som arne_v også skriver er vejen frem.

Er det asp.net mvc ? eller er det hele dit eget i WinForms/WPF? Skal du bruge MVC ellers er der jo alternativer som MVVM.
Avatar billede havmaage Juniormester
27. maj 2011 - 22:03 #9
Jeg synes jeg har fået det jeg skulle bruge til mit lille program sådan rent design mæssigt, jeg har fået en masse ud af dette, men nu er der en anden udfordring som jeg gerne vil oprette et andet spørgsmål til.
Så hvis i vil lægge et svar deler jeg point's synes buzzz og arne_v skulle dele, men hvis i er af anden mening så skriv det :-)

Tak for jeres hjælp
Avatar billede arne_v Ekspert
27. maj 2011 - 22:11 #10
svar
Avatar billede Syska Mester
27. maj 2011 - 22:54 #11
svar
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